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

AutoHotKeyで長押しの時の動作を変えたいと思ったんだけど、ちょっと嵌ったのでメモ。

ここのページを参考に、下記のように書いて走らせようとした。

F15::                             ;F15キーを押した時
KeyWait, F15, T0.3                ;F15キーが離されるのを0.3秒待つ
If (ErrorLevel){                  ;ErrorLevelが1であれば、
    Send,LF15             ;文字列1を出力
    KeyWait, F15                  ;F15が離されるのを待つ
    return
}else{                            ;そうでなければ、
    Send,SF15。    ;文字列2を出力
    KeyWait, F15                  ;F15が離されるのを待つ
    return
}

短く押すと「SF15」、長く押すと「LF15」が出るはずだったんだけど、長押ししても、「SF15」しか表示されない。

原因を探ると、下記コードがahkファイルに含まれていたのが原因だった。

F15 & WheelUp::Home
F15 & WheelDown::End

「F15::」だけが存在するなら、キーを押したときに実行されるけど、組み合わせキーで使われていたら、キーを離した時に「F15::」の定義が実行される。

まあ、考えてみれば当たり前っちゃー当たり前でした。。。

他に組み合わせ定義があるのに、キーダウンした瞬間に実行されたら、他の組み合わせキーが動かなくなるしね。。。

自動的にキーアップでトリガーされるように切り替わるみたいです。

 

対策コード

こんな感じにしてみました。

F15::                             ;F15キーを押した時
	KeyWait, F15, T0.3                ;F15キーが離されるのを0.3秒以内に離されるのを待つ
	If (ErrorLevel){                  ;離されなければ、ErrorLevelが1
		Send,LF15                 ;文字列1を出力
	}
	else{                            ;そうでなければ、
		Send,SF15                ;文字列2を出力
	}
	KeyWait, F15                     ;F15が離されるのを待つ
return
WheelUp::
	If (GetKeyState("F15","P")){
		Send {Home}
	}
	else{
		Send {WheelUp}
	}
return
WheelDown::
	If (GetKeyState("F15","P")){
		Send {End}
	}
	else{
		Send {WheelDown}
	}
return

これで、F15を短く押すと「SF15」、長く押すと「LF15」、F15を押しながらホイールを回すと、それぞれHomeとEndが実行されるようになった。

Follow me!

コメントを残す

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