[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]$(ドルマーク)の効果検証

[AHK]長押しで動作を切り分ける。

[AHK]複数キー同時押し指定すると、単一キーで動かない

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です