スマートフォン用の表示で見る

☆ENDO LEDベースダウンライト ERD4434W(ランプ付) 【XL501025P3E】 小型ペンダント NNN73065KLE9

100%品質☆ENDO LEDベースダウンライト ERD4434W(ランプ付) 【XL501025P3E】 小型ペンダント NNN73065KLE9

「WinMouse+」開発記録 Part1

「WinMouse+」開発記録 Part1

以前からマウスの操作に違和感を感じていたので、Windowsのマウスカーソル移動処理をフックして独自の移動処理に置き換えるソフトを開発することにしました。

先に言っておくと、マウス処理のフックは非常に簡単です。
「マウス フック」で検索すればやり方もサンプルも出てきます。

問題は「マウスのセンサーに問題がある場合にどうすれば快適に使えるのか」になります。

☆ENDO LEDベースダウンライト ERD4434W(ランプ付) 【XL501025P3E】 小型ペンダント NNN73065KLE9

私が使っているマウスはLogicoolのM500tです。
これは3000円以上するマウスなので安物ではないはずです。

実はこのマウス、センサーに問題があります。

これはマウスを右下に動かしたときの移動量を計測したものです。

x,y: 19, 20
x,y: 20, 21
x,y: 38, 40
x,y: 19, 20
x,y: 41, 38
x,y: 20, 19
x,y: 21, 19
x,y: 42, 40
x,y: 21, 20
x,y: 41, 41
x,y: 21, 20
x,y: 42, 41
x,y: 22, 20
x,y: 21, 20
x,y: 44, 41
x,y: 22, 21
x,y: 44, 40
x,y: 22, 21
x,y: 22, 20
x,y: 45, 42

この結果をよく見ると20くらいの値と40くらいの値が交互に出てくるのに30くらいの値は出てきませんね。まるで処理落ちが発生して2回分まとめて処理したような結果です。

ですが処理落ちは発生していませんでした。マウスのレポートレートは125Hzですが、仕様通り1秒間に125回処理されています。

おそらく、センサーの記録更新頻度とレポートレートがあっていないのでしょう。解析プログラムを作ってセンサーの記録更新レートを予測させてみましたが何度やっても175Hzになりました。

M500tは1度ボタンが壊れて新しいのを送ってもらったことがあるので、そのボタンが壊れた方でも同じ実験をしましたが、そちらでも同じ症状が発生しました。

逆に他の機種(LogicoolのG300r)でも同じ実験をしましたが、こちらにはこのような症状はありませんでした。

なのでM500t固有の症状となります。

そして、この症状はカーソルの加速処理で問題になります

レビュー投稿で次回使える2000円クーポン全員にプレゼント アサヒ 【まとめ買い50個セット】ボール球 G50 セラミック塗装 110V10W イエロー E17 G50E17110V-10W(Y)セラミック-50SET 【生活家電\電球・蛍光灯\電球\ベビーボール球】,ホーロー看板 HOME APPLIANCES(インテリア/看板/店舗/アメリカン雑貨/),,東芝ライテック 蛍光灯 40W直管 FL40SSEXN37H10P 昼白 10本【ポイント10倍】,オーデリック スポットライト 【XS 414 009】 店舗・施設用照明 テクニカルライト 【XS414009】 【せしゅるは全品送料無料】【セルフリノベーション】,レビュー投稿で次回使える2000円クーポン全員にプレゼント オーデリック LEDスポットライト HID100Wクラス 温白色(3500K) 光束2867lm 配光角20° ブラック XS256324 【生活家電\照明器具・部材\照明器具\スポットライト】,三菱電機 MY-X470230/W AHTN LEDライトユニット形ベースライト 直付形 下面開放タイプ 一般タイプ,【東芝】【工事必要】【セット商品】LEDベースライトTENQOOシリーズ LEKR419693L-LD9,Panasonic(パナソニック) 一体型LEDベースライト(iDシリーズ) NNL4600TNLE9(代引不可)【送料無料】,パナソニック XLX800NEW LE2 天井直付型 110形 一体型LEDベースライト,シーリングライト PANASONIC LGBZ3442,インターフォルム INTERFORM リアルト RIALTO 電球なし LT-7863 【送料無料】,DAIKO 調色シーリング 【~14畳】 DCL-38554SS,LouisPoulsen(ルイスポールセン)「PH3/2Table」シルバー/ガラス[テーブルスタンド/北欧照明/デザイナーズ/輸入]【PH 3/2 Table Chrome】,Panasonic(パナソニック) シーリングライト NNFW22020LE9(代引不可)【送料無料】,日立 【お買い得品 10台セット】 交換形LEDベースライト 《スマートユニット》 40形 直付形 逆富士形 幅230mm 5200lmタイプ FHF32形2灯器具相当 昼白色 連続調光・固定出力兼用 NC4B1+CE405NE-X14A_set
【受注生産品・代金引換不可】パナソニック施設照明 FYY26438LA9 ベースライト 天井埋込型 畳数設定無し LED【送料無料】【smtb-TK】【setsuden_led】,◎パナソニック 誘導灯・非常灯用バッテリー 4.8V 3500m Ah FK167,,Panasonic(パナソニック) 天井埋込型 一体型LEDベースライト(NNFK35013+NNFK37411CLT9) XL574ZPUCLT9(代引不可)【送料無料】,【カード決済OK】コイズミ LED間接照明器具 AL42512L,DAIKO(大光電機) LED間接照明用器具 DSY-4543NS(代引不可)【ポイント10倍】,【ポイント10倍】NEC ライフルックHG FLR110HEX-D/A/100-HG直管ラピッドスタート形 昼光色 100W×10本セット   【RCP】【楽フェス_ポイント10倍】,LEDパネルミナペンダントLGB15221LG1(電気工事必要:レール取付不可)パナソニックPanasonic,三菱 3波長形直管ランプ40W ラピッドスタート形 ルピカ昼光色 25本 【メーカー直送/代金引換決済不可】【照明 インテリア 店舗内装 店舗改装 おしゃれな センス】,【12本セット】オーム電機 LED電球 LDT7L-G-E17 IS9 (06-0227) [60W形相当/E17][電球色],,【ポイント10倍】[SB]Panasonic LEDシーリングライト ~12畳 LGBZ3411,TOSHIBA(東芝ライテック) LEDシーリングライト LEDH82101Y-LC(代引不可)【送料無料】,【木目調のおしゃれなシーリングライト・リモコン付き・蛍光灯】Moment-ceiling lamp AW-0272モーメントシーリングランプARTWORKSTUDIO アートワークスタジオ【天井照明 照明器具 インテリア照明 マーキュリー】【TC】【NGL】【AWS】【送料無料】,Panasonic 小型シーリングライト 100形相当 LGB51580LE1,スポットライト シーリングライト 4灯【SNAFKIN4:スナフキン4】照明 おしゃれ ホワイト/ブラック/グリーン 西海岸 インダストリアル LED対応 ライト リビング用 ダイニング用 食卓用 ヴィンテージ レトロ ウッド 可愛い 間接照明 ウッド 古材風 HERMOSA ハモサ,コイズミ XH91160L シーリングライト 電源ユニット別売 LED【setsuden_led】

☆ENDO LEDベースダウンライト ERD4434W(ランプ付) 【XL501025P3E】 小型ペンダント NNN73065KLE9公式の店舗

☆ENDO LEDベースダウンライト ERD4434W(ランプ付)

ダイコー LEDシーリングライト【カチット式】 DXL-81128【smtb-k】【ky】,オーデリック LED洋風ペンダントOP093132PC,,【61%OFF!】【36720円⇒14320円】Panasonic(パナソニック)【工事必要】LEDペンダント60形電球1灯相当シンクロ調色明るさフリー(ライコン別売)調光・調色タイプLGB10714LU1【PD】,DAIKO大光電機LEDスポットライトLZS-91763YW,◎ENDO LEDユニバーサルダウンライト ERD4248W-P(ランプ付),☆【KOIZUMI コイズミ照明】 ペンダントライト 『AP35746L』洋室・リビング あたたか味のある暖色 ~6帖,MAXRAY(マックスレイ) ペンダント MP40407-44(代引不可)【送料無料】,KOIZUMI(コイズミ照明) LEDユニバーサルダウンライト XD90122L(代引不可),Panasonic(パナソニック) 天井埋込型 LED(白色) ダウンライト(NDN16101+NNK16001NLE9) XNDN1619WWLE9(代引不可)【送料無料】,【LEDアウトドアスポット】【電球色】DOL-4441YB,【正規品】【送料無料】★ルイスポールセン(louis poulsen)ペンダント【コラージュ 450/ダーク・グリーン(Collage450)】,【正規品】【送料無料】★ルイスポールセン(louis poulsen)アウトドアライト【スコット ウォール/LED 3000K クロスガード+ 乳白カバー グラファイト(Skot Wall)】,【LEDランプ付き】【正規販売店】LE KLINT(レ・クリント)「130A」【送料無料】ペンダントランプ/ペンダントライト照明【RCP】02P03Dec16,【照明 テーブルランプ】LE KLINT レ・クリント MODEL 320B【送料無料】 スノードロップ 北欧 ノルディックデザイン デンマーク ハンドクラフト,レ・クリント MODEL KT312-2 テーブルランプ312-2 レクリント Le Klint 照明 シェード スタンドライト ハンドメイド ハンドワーク 【送料無料】

実はマウスカーソルの移動量はマウスの移動量に比例せず、速度に応じて変わるようになっています。

マウスをゆっくり動かせばカーソルの移動量は本来の移動量より少なくなり、精密な動作ができます。マウスを速く動かせば本来の移動量より多くなり、マウスを大きく動かさなくても画面の端から端まで移動できます。

この機能はコントロールパネルのマウスのプロパティで「ポインター精度を高める」にチェックを入れると有効になります。

さきほどの測定結果はこの加速処理がされていない生の値でした。

加速処理を有効にすると次のようになります。

x,y: 27, 20
x,y: 82, 56
x,y: 27, 20
x,y: 26, 18
x,y: 83, 56
x,y: 27, 20
x,y: 30, 21
x,y: 83, 56
x,y: 31, 21
x,y: 82, 56
x,y: 31, 22
x,y: 82, 56
x,y: 31, 21
x,y: 26, 17
x,y: 82, 56
x,y: 27, 21
x,y: 82, 56
x,y: 24, 19
x,y: 27, 20
x,y: 78, 52

さきほどの生の値と比べて差が激しくなりました。2倍だった差が3倍にまで広がっています。

センサーの記録が1回分のところは低速と判定され移動量が少なめになり、2回分のところは高速と判定され移動量が多めになっているからです。

こうなると加速処理の本来の特性が薄れてしまいます。これが違和感の正体でした。

ちなみに加速処理を無効にすると違和感は無くなりますが、それだと低速に設定すると画面の端から端まで移動するのにマウスを大きく動かさなければならず、高速に設定すると細かい作業がしづらくなります。

どうやって解決するのか

マウスを変えれば解決するのはわかっていますが、M500tの形状とか重さとか気に入っているのでそれは無しの方向で考えます。まあ、欲を言えばもっと解像度の高いマウスが良かったと思っています(M500tは1000DPIしかない)が、3000円以上払ったし保証もまだ残っているのでやっぱり使い続けることにします。

そういうわけでソフト側でなんとか対応しようと思います。

とりあえずフックしてみて分かったのが、カーソル移動量の変更方法は2種類あります。

1つは移動量を直接変更する方法。もう1つは移動量を0に変更しておいて、後からカーソルを動かす方法。

前者のやり方だとマウスを動かしているときにカーソルを動かすことができますが、マウスが止まっているときにカーソルを動かすことはできません。後者のやり方だとマウスが止まっていてもカーソルを動かすことができますが、マウスの移動からカーソルの移動までに遅延が生じます。

この2つで上記の症状を緩和する方法を考えなければなりません。

例えば後者のやり方なら移動平均を使って移動量を平均化することができます。その場合カーソルは慣性のついた動きになり、マウスを止めてからカーソルが止まるまでに少し時間があります。

あるいは違和感の少ない加速処理を考えて実装する方法もあります。残念ながらそのような加速処理は現時点で思いついていません。

他には加速処理を使わない方法でうまいやり方を模索することもできます。例えばショートカットキーやマウスのボタンで速度を変える方法があります。

いろいろ案を練っていますが、まだ「これだ」という案が出ていません。

他にやりたいこと

Windowsのカーソル座標の精度を内部で小数を使うことで上げられないかと考えています。厳密にいえばWindowsも加速処理では高精度な座標計算をやっているようですが、もっといいやり方があるような気がします。

小数で管理するなら閾値の計算もしなければなりません。小数を整数に丸める場合、小数点以下を切り捨てだろうと四捨五入だろうと必ず境界があります。

例えば0以上1未満は0に、1以上2未満は1に切り捨てる場合、1付近は境界になります。
この場合、0.99は0に、1.00は1になります。

つまり、カーソルが1.00付近にある場合、たった0.01のプラスマイナスでカーソルが行ったり来たりします。

この問題は小数点以下が累積しやすい高DPIマウスでよく起こります。
 >  >  > ☆ENDO LEDベースダウンライト ERD4434W(ランプ付)

この問題を防ぐには閾値を設ける必要があります。。

例えば閾値を±0.5にすると、カーソルが0にある場合、内部座標が1.5以上になったら1に移動します。カーソルが1にある場合は内部座標が0.5以下になったら0に移動し、2.5以上になったら2に移動します 。

このやり方だと境界が移動するので高速で行ったり来たりすることが無くなります。

他には高速スクロールが使い物にならない(ホイールが勝手に動く)ので独自の高速スクロールを実装したいとか、マウスの速度切り替えも実装したいとかいくつか案があります。

とりあえずできたもの

WinMouse+_alpha01.zip

実装した機能
加速処理4種類
小数座標(閾値の計算あり)
加速前の移動量の平均化(前回の移動量との平均)
独自の高速スクロール
低速モード

これだけの機能を実装してもコードは400行でした。

作ってて面白くなってきたのでもっと機能を増やそうと思います。

スターをつけました

引用をストックしました

引用するにはまずログインしてください

引用をストックできませんでした。再度お試しください

限定公開記事のため引用できません。。。

読者です 読者をやめる 読者になる 読者になる
{yahoojp}xt01-myp07-gui-545