[AHK]GetKeyStateでAlt,Ctrl,Shift,Windowsの状態を取得できない。

気付けば下らない内容だったんだけど、地味に嵌ったんでメモ。

下記のように記述して、ただ、lを押した時と、bを押しながらの場合と、Ctrlを押しながらの場合で別々の動作をさせようとした。

#UseHook On
l::
	If (GetKeyState("b","P")){
		Send b{+}l
	}
	else If (GetKeyState("Ctrl","P")){
		Send Ctrl{+}l
	}
	else {
		Send l
	}
return

テストすると、l単独と、b+lはうまく動くが、Ctrl+lだけうまく動かない。

原因

Ctrlを押しながらlを押すと、AutoHotKeyには^lが飛ぶので、l::は実行されなかった。

実際、下記のように^l::のトリガーを記述をして、Ctrl+lを押してやると、「Ctrl+l2」が入力された。

#UseHook On
l::           ;そもそもこちらに入らない
	If (GetKeyState("b","P")){
		Send b{+}l
	}
	else If (GetKeyState("Ctrl","P")){
		Send Ctrl{+}l           ;当然こちらは実行されない。
	}
	else {
		Send l
	}
return
^l::Send Ctrl{+}l2      ;こちらが呼び出し

対策

「*l::」という風にアスタリスクを追加する。

これで、任意の修飾キー(Alt,Ctrl,Shift,Windows)の状態にかかわらず、lが押された時に実行されるようになる。

#UseHook On
*l::
	If (GetKeyState("b","P")){
		Send b{+}l
	}
	else If (GetKeyState("Ctrl","P")){
		Send Ctrl{+}l
	}
	else {
		Send l
	}
return

なお、下記のように*lとは別に^lが存在すると、^lの方が優先される。

#UseHook On
*l::
	If (GetKeyState("b","P")){
		Send b{+}l
	}
	else If (GetKeyState("Ctrl","P")){
		Send Ctrl{+}l        ;こちらは実行されない。
	}
	else {
		Send l
	}
return
^l::Send Ctrl{+}l2      ;Ctrl+lはこちらが優先されて実行される

 

関連

[AHK]$(ドルマーク)の効果検証
AutoHotKeyのキー修飾の「$」を見ると下記のような説明が書いてあるが、正直分かりにくい。RegisterHotkey()ではなく、強制的にキーボードフックでイベントを取得する。(NT系専用)サブルーチン内でそのホットキー自...
[AHK]長押しで動作を切り換えるショートカットを作る。
AutoHotKeyで長押しの時の動作を変えたいと思ったんだけど、ちょっと嵌ったのでメモ。ここのページを参考に、下記のように書いて走らせようとした。F15:: ;F15キー...
[AHK]複数キー同時押し指定すると、単一キーで動かない
AutoHotKeyで、&で2つのキーを同時押したときの動作を指定すると、指定したキー単体を押したとき反応しなくなった。設定してるのは、無変換キーを押しながら同時押しするとテンキーになるように設定したんだけど、無変換だけを押してもシグナ...

 

コメント

PAGE TOP
Ads Block Detector Powered by codehelppro.com
Ads Blocker Detected!!!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました