その買うを、もっとハッピーに。|ハピタス

デュアルモニタ間マウス移動をチルトホイールへ割り当てる事を流行らせる会

長ったらしいタイトルで、流行らせる会とか何なのって感じですが(笑)
それくらい久しぶりに、キタ━━━━ヽ(・∀・` )ノ━━━━!!!!って思ったAutoHotKeyの設定をご紹介。
まぁ、何を便利に感じるかは人それぞれであったりしますが、個人的には最近では大ヒットかもしれません(笑)
ファイル名を指定して実行の便利な使い方を覚えた時に近いくらい(゚∀゚)キタコレって思いました。

デュアルモニタ間での移動


Windows7ではデュアルモニタ用のキーコマンドがあって、「WIN + Shift + ←」及び「WIN + Shift + →」でウィンドウをデュアルモニタ間で移動出来ます。
デュアルモニタを導入した者としてはこのキーコマンド大変重宝してますが、マウスポインタの移動はデフォルトでは出来ません。
デュアルモニタ間のマウスポインタの移動が煩わしく思っておりましたので、AutoHotKeyで作成しようと思った訳ですが、これをチルトホイールに割り当てることにより更に便利に感じました。

快感度を高めた秘密(笑)


煩わしさから解放された時の、あの「快感度」が何故高かったのか自分なりに考えてみました。
まず第一に、マウスポインタを移動させる補助になる訳ですから、その時のフォームは両手キーボードでは無く、左手キーボードで右手はマウスを持った状態になります。
つまりキーボードの左側かマウスに動作を割り当てる事が望ましくなりますが、デュアルモニタ間の移動は比較的頻繁に行いますし、マウスポインタの移動といった動作柄、マウスに割り当てる方が望ましそうです。
ではマウスの中でどこにどう割り当てるのが良いかとなると、比較的頻繁に行うことから、〇〇を押しながら〇〇みたいなアクションでは無くシンプルなアクションが望ましいです。
そこでチルトホイールです。
ペタンと横に倒すだけですし、右に倒せば右のディスプレイへ、左に倒せば左のディスプレイへとビジュアル的にも解り易いです。


これらの条件が、あの「快感度」を高めたのでしょう(笑)
…やっぱりキーコマンドオタクかも(´Д`)

AutoHotKeyスクリプト

;デュアルディスプレイ間マウス移動
WheelLeft::
	CoordMode,Mouse,Screen
	MouseGetPos,x,y
	;軌跡も無く瞬時に移動したい場合はWindowsAPIを使用
	;DllCall("SetCursorPos", UInt,x - A_ScreenWidth, UInt,y)
	MouseMove,x - A_ScreenWidth,y
return
WheelRight::
	CoordMode,Mouse,Screen
	MouseGetPos,x,y
	;DllCall("SetCursorPos", UInt,x + A_ScreenWidth, UInt,y)
	MouseMove,x + A_ScreenWidth,y
return
処理の流れ


プログラムの内容は至ってシンプルです。
マウスポインタの座標を取得し、組み込み変数の「A_ScreenWidth」でディスプレイの横幅を取得し、「マウスポインタのx座標 - ディスプレイ幅」または「マウスポインタのx座標 + ディスプレイ幅」とやってるだけです。
ディスプレイ幅分足されたり引かれたりする訳ですから、そのまま隣のディスプレイへ移すことになります。

SetCursorPos(WindowsAPI)


組み込み関数のMouseMoveでマウスポインタを移動させてますが、実際ウィンドウ幅分移動させてみると、ほんの一瞬ですがポインタの軌跡が見えます。
反面、コメントアウトしてあるWindowsAPIのSetCursorPosの場合は軌跡は見えません。
これはそういった仕様なのか、処理がMouseMoveよりも速いのか分かりませんが、もしかしたら処理が速いのかもしれませんね。
昨日のウィンドウ移動の関数でも、実は組み込み関数のWinMoveより直接WindowsAPIから呼び出した方が劇的に速かったです。
ですので、昨日のプログラムはまた改訂版を載せます。


一回の動作の中で一度関数を使用するだけなので、個人的には一瞬の軌跡が見えた方が良かったので今回はMouseMoveを使用してますが、ループ文の中で何回も関数を利用する場合はもしかしたらDllCallでWindowsAPIを直接使った方が良いのかも。


因みにMouseGetPosですが、簡単に計ってみましたが、こちらは組み込み関数の方が処理が速かったです。
WindowsAPIのGetCursorPosの場合構造体が必要で、これをAutoHotKeyで使用するための関数で処理に時間が掛かってるのかも。

正確な処理にはSysGet


上記のプログラムは非常に単純で、条件分岐など何にもしてませんが、もしちゃんとやる場合はSysGetやWindowsAPIを使った方が良いです。
でも双方のディスプレイの大きさが違ったりとかもっと色々な処理をしたかったりで無ければ、上記のプログラムで十分だと思います。