情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

AutoHotkeyとキーボード・マウス共有ソフトMouse without Bordersとを共存させるAHKスクリプト

AutoHotkey (28) Mouse without Borders (3) Windows 7 (62)

AutoHotkeyを使っている状態で、キーボード・マウス共有ソフトである「Mouse without Borders」を使っていると、いろいろな難しい問題が起こることを前の記事で紹介しました。その対策となるAutoHotkeyスクリプトをその場しのぎ的ではありますが、せっかく書いたので、紹介します。

AutoHotkey+Mouse without Bordersでの問題回避方針

問題は、共有元PCのAutoHotkeyのフックと、共有元PCのMouse without Bordersのフックとが衝突、というか、ややこしいことになるのが問題でした。

これは、SendPlayがグローバルフックに引っかかってくれないのが問題だったりするのですが、共有元PCのAutoHotkeyをオフにすれば、ちゃんとMouse without Bordersのグローバルフックがそのまま共有先PCにキーストロークを送信してくれて、共有先PCのAutoHotkeyが解釈してくれます。

というわけで、回避方法は、「共有先PCにマウスカーソルが行っているときだけ、共有元PCのAutoHotkeyを一時停止する」というものです。

共有先PCを操作中かどうかどうかの判定

そうなると、共有先PCを操作中かどうかの判定が必要になるのですが、AutoHotkeyに付属しているWindow Spyで監視してみると、共有先PCにマウスカーソルが移動している最中、論理的にはマウスカーソルが特定の座標に強制移動させられていることが分かります。

その座標のY座標は「3」で、X座標はおよそ画面の横サイズの半分(「横サイズ/2 - 1」?)なのですが、とりあえず、毎回同じ位置になる、というのは分かります。PCによってことなり、とりあえず私の環境では、「(1279,3)」「(799,3)」でした。これを使って判定します(神がかり的な確率で、その位置になってしまったら諦める)。

スクリプト

とりあえず作ったシンプルなスクリプトがこちらです。

SetTimer, MouseWithoutBordersChecker, 200

MouseWithoutBordersChecker:
	CoordMode,Mouse,Screen
	MouseGetPos, MX, MY
	If (MY = 3) && (MX = 1279 || MX = 799)
		Suspend, On
	Else
		Suspend, Off
Return

200msecごとにマウスの位置を監視して、共有先PCと共有元PCのどちらにマウスカーソルがあるかを判定しています。

もちろん、1279や799の部分は、事前にWindow Spyで測定しておいたX座標を入れておきます。

ちなみに、Ifの「MY = 3」をちゃんと「(MY = 3)」にしないと、ちゃんと意図した通りの動作になりません。このあたり、AutoHotkeyのなかなか飲み込めない細かい部分です。正しい書き方をなかなか覚えられません。

成功

これで、見事にマウスカーソルの位置に応じてAutoHotkeyがON/OFFして、意図したとおりの動作になります。そして、これならば、既存の.ahkの大幅な書き直しも必要ないはずです。

注意点

すでに手動でSuspendするホットキーを.ahkで用意している場合は、そのときにTimerを止めておかないと、すぐ解除されてしまうので、注意してください。

コメント(0)

新しいコメントを投稿