[AHK]Ctrlは操作してないのに、LControlが押し離しされる。

不具合内容

G600にWin+F22を割り当て、これをAutoHotKeyでCtrl+Sにし、マウスでファイルの保存が出来るようにしていた。
AHKのコードは下記のような感じ。

#F22::
	KeyWait, LWin
	SendEvent, ^s
return

これでEXCELを保存しようとしたのだが、貼り付け作業の後、だとうまく動かなかったので解析してみた。

原因

キーのログを確認してみると、Ctrlキーを1回押して離すという操作を行ってから、Ctrl+Sを押していた。

5B  15B	 	d	0.48	LWin           	
85  06D	h	d	0.00	F22            	
5B  15B	 	u	0.16	LWin           	
A2  01D	i	d	0.00	LControl       	何故か1回LControlを下げ上げ
A2  01D	i	u	0.00	LControl       	
85  06D	s	u	0.00	F22            	
A2  01D	i	d	0.00	LControl       	
53  01F	i	d	0.00	s              	
53  01F	i	u	0.00	s              	
A2  01D	i	u	0.02	LControl  

EXCELは貼り付けした後、Ctrlキーを押すと、貼り付け形式の選択が開かれるが、この状態だとCtrl+Sでの保存は利かない。

何がCtrlを押してるのか調べると、Winキー+Functionキーをトリガーに実行された場合、F1-F9までは、問題ないけど、F10以降のキーと組み合わせると、Ctrlが生成されるみたい。下記の様な、returnするだけのコードでCtrlが生成されている。(AutoHotKeyのバグ臭いですね。。。)

;AHKコード
#F10::return

結果
5B  15B	 	d	0.95	LWin           	
79  044	h	d	0.38	F10            	
79  044	s	u	0.08	F10            	
5B  15B	 	u	0.27	LWin           	
A2  01D	i	d	0.00	LControl       	Controlが下げ上げされる。
A2  01D	i	u	0.00	LControl       	

対策F10~F12まで

下記のように、UseHookをOffにすると、F10~F12まではCtrlが生成されなくなった。
しかしながら、F13以降は生成されるみたい。。。

#UseHook Off	;Offにする
#F10::return

結果
5B  15B	 	d	2.16	LWin           	
79  044	 	d	0.16	F10            	
79  044	 	u	0.08	F10            	
5B  15B	 	u	0.08	LWin           	

対策F13~F24まで

残念ながら、根本的な対策はうまい方法が見つかりませんでした。

Word,EXCEL,PowerPoint,Outlookは、貼り付け直後にCtrlを押すと、やり方の選択画面が開かれます。これらのアプリは、ESCを押して選択画面を消してから保存するか、Alt+1で保存するとうまくいきました。取り合えずなら、ESC飛ばしてからCtrl+s、ESCによる不具合リスクを避けるなら、アクティブウィンドウで出すコマンド切り替えるのが無難そうです。

;ESCしてみる
#F22::
	KeyWait, LWin
	send,{ESC}
	send,^s
return

;アプリ判定で切り替え
#F22::
	if(WinActive("ahk_exe (WINWORD.EXE|EXCEL.EXE|POWERPNT.EXE|OUTLOOK.EXE)")){
		send,!1
	}
	else{
		send,^s
	}
return

AHKとして、バグが治ってくれると良いんだけどな。

 

2021/08/13, 追記

昔、色々やったの完全に忘れてた。。。

[AHK]LControlを操作してないのに、LControlがキーログに表示される。
ウィンドウズキーとの組み合わせで指定していたショートカットの動作がおかしいことがあったので調べてみた。事象としては、下記のようにWinキーとの組み合わせをトリガーにSendでキーを上げる操作を送ると、Controlを押して放しての操作が...

Send, {Blind}{F22 Up}をすればLControlは消えるみたい。

#F22::
	Send, {Blind}{F22 Up}
	KeyWait, LWin
	send,^s
return

実行結果

5B  15B	 	d	0.23	LWin           	
85  06D	h	d	0.00	F22            	
85  06D	i	u	0.00	F22            	
5B  15B	 	u	0.14	LWin           	
85  06D	s	u	0.00	F22            	
A2  01D	i	d	0.01	LControl       	
53  01F	i	d	0.00	s              	
53  01F	i	u	0.00	s              	
A2  01D	i	u	0.00	LControl       	

これで、完璧に動作するようになりました。

昔やったの忘れてたのが痛い。。。

コメント

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をコピーしました