読者です 読者をやめる 読者になる 読者になる

blechmusikの日記

キー・カスタマイズ・ソフトウェア "DvorakJ" の覚え書きをはじめとして様々なことを書いています。

特定の条件下では、無変換キーを発行するとBackspaceのイベントが発生する

はじめに

右Ctrl と [Back Space] で [Ctrl] + [Back Space] を発行する際の問題点と改善策 - blechmusik2の日記の続きである。
141Fさんから、DvorakJ の不具合が解消されていないとの報告を受けた*1。141FさんがDvorakJの挙動を調べて下さったエントリー「Weblog 61℃: DvorakJ + ATOK2012 での確定アンドゥ」によると、VJEスタイルの確定アンドゥ動作に問題があるようだ。
調査の結果、ATOKのVJEスタイルの確定アンドゥのキーバインド [無変換] について、 AutoHotkey は独特の挙動を示していることが分かった。
このエントリーでは、 [無変換] を AutoHotkey で扱う際の挙動を検証する。その際、先のエントリーのように、使用方法 - AutoHotkeyJpのKey history and script infoの表記にならって、キーの発行処理を説明しよう。

検証

キーイベントのログ

まず、ATOKのVJEスタイルの確定アンドゥのキーバインドについて調べてみよう。スタイルをVJEにしてATOKのキーカスタマイズを確認するとつぎのような画面が表示される。

今回確認するのは確定アンドゥのうち無変換キーを用いる挙動で、なかでも文字未入力の状態で行うものである。なぜかというと、141Fさんが提示なさっている例が、どれも無変換キーを押す前に文字を確定しているからだ。
ここでは仮に、変換キー、改行キー、無変換キーの順にキーを押すと不具合が生じると想定してみよう。
メモ帳を開き何も文字を入力しない状況で変換キー、改行キー、無変換キーの順にキーを押すとログはこうなる。ここでログ中のスキャンコードについて補足しておこう。"not found"と表示されているキー情報のうち、sc079が変換キーを、sb07Bが無変換キーを指している。

VK  SC	Type	Up/Dn	Elapsed	Key
-------------------------------------------
1C  079	 	d	0.81	not found      	
1C  079	 	u	0.16	not found      	
1C  079	i	d	0.00	not found      	
1C  079	i	u	0.00	not found      	
0D  01C	 	d	0.33	Enter          	
0D  01C	i	d	0.00	Enter          	
0D  01C	i	u	0.00	Enter          	
0D  01C	 	u	0.11	Enter          	
1D  07B	 	d	0.37	not found      	
1D  07B	 	u	0.13	not found      	
1D  07B	i	d	0.00	not found      	
1D  07B	i	u	0.00	not found      	

問題は無いようだ。


しかし、「こうしんした」と入力し文字列が未確定の状況であれば、ログの内容が大きく変化する。
まずスクリーンショットを掲げよう。




そのログはこうだ。

VK  SC	Type	Up/Dn	Elapsed	Key
-------------------------------------------
1C  079	 	d	0.03	not found      	
1C  079	 	u	0.11	not found      	
1C  079	i	d	0.01	not found      	
1C  079	i	u	0.00	not found      	
0D  01C	 	d	0.19	Enter          	
0D  01C	i	d	0.00	Enter          	
0D  01C	i	u	0.00	Enter          	
0D  01C	 	u	0.12	Enter          	
1D  07B	 	d	0.42	not found      	
1D  07B	 	u	0.11	not found      	
1D  07B	i	d	0.00	not found      	
1D  07B	i	u	0.00	not found      	
08  00E	a	d	0.22	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	i	d	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	i	u	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	i	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	i	u	0.00	Backspace      	
08  00E	i	d	0.00	Backspace      	
08  00E	i	u	0.00	Backspace      	
08  00E	i	d	0.00	Backspace      	
08  00E	i	u	0.00	Backspace      	

多量のBackspaceが出現してしまうのだ。typeがiとなっているもの、つまりAutoHotkey自身がキーを発行している処理が目につく。それは仮想的な押し下げと押し上げが4回ずつとなっている。
ただ、そうはいうものの最終的な挙動は私の環境においては特に問題がない。VJEスタイルのATOKでは、確定アンドゥ直後にBackspaceを何度入力しても、変換中の文字列に何ら影響を与えないからである。

Backspaceが出現する条件

つぎにBackspaceが出現する条件を考えてみる。そのためには、ごく簡潔なスクリプトを作成して挙動を観察すればよいだろう。
試しに次のようなスクリプトを作成した。無変換キーを押すと無変換キーを出力するが、その際にはOSの起動から経過した事件をツールチップ上に描写する。F12でプログラムを終了できるようにしている。

F12::ExitApp

sc07b::
ToolTip,% A_TickCount
send,{sc07b}
return

このスクリプトを動作させた上で上記と同様の観察を行うと以下のようになる。

VK  SC	Type	Up/Dn	Elapsed	Key
-------------------------------------------
1C  079	 	d	0.94	not found      	
1C  079	 	u	0.06	not found      	
0D  01C	 	d	1.95	Enter          	
0D  01C	 	u	0.09	Enter          	
1D  07B	h	d	2.23	not found      	
1D  07B	i	d	0.00	not found      	
1D  07B	i	u	0.00	not found      	
1D  07B	s	u	0.08	not found      	
08  00E	a	d	0.14	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace

やはりBackspaceが現れるのだ。もっとも、こちらの場合は、AutoHotkeyではなくて他のプログラムが発行したBackspaceしか現れておらず、AutoHotkey自体はBackspaceを仮想的に発行していない。


検証を進めよう。これは無変換キーをキーフックの対象としているせいなのか、それとも、キーフックの対象とするキーに関わらず、無変換キーを発行しているために生じているのだろうか。
無変換キーを発行すればBackspaceの処理が現れると想定し、ここではテンキーの0を押せば無変換キーを仮想的に発行させるスクリプトを作成した。

F12::ExitApp

numpad0::
ToolTip,% A_TickCount
send,{sc07b}
return

実行結果は次の通りだ。

VK  SC	Type	Up/Dn	Elapsed	Key
-------------------------------------------
1C  079	 	d	0.34	not found      	
1C  079	 	u	0.08	not found      	
0D  01C	 	d	1.06	Enter          	
0D  01C	 	u	0.09	Enter          	
60  052	 	d	0.86	Numpad0        	
1D  07B	i	d	0.00	not found      	
1D  07B	i	u	0.00	not found      	
60  052	 	u	0.08	Numpad0        	
08  00E	a	d	0.14	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace

やはりBackspaceの処理が現れる。

ではAutoHotkeyが無変換キーを仮想的に発行しないとき、つまりsend,{sc07B}としないときはどうなるだろうか。

F12::ExitApp

これを実行した上で挙動を確認してみよう。

VK  SC	Type	Up/Dn	Elapsed	Key
-------------------------------------------
1C  079	 	d	0.00	not found      	
1C  079	 	u	0.11	not found      	
0D  01C	 	d	0.50	Enter          	
0D  01C	 	u	0.11	Enter          	
1D  07B	 	d	0.17	not found      	
1D  07B	 	u	0.11	not found      	
08  00E	a	d	0.11	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	

ここでもBackspaceの処理が現れる。どのような形であれ無変換キーが発行されるとBackspaceが現れるようだ。

これより、VJEスタイルで文字列を変換している最中に、AutoHotkeyが無変換キーを発行すると、Backspace関連の不要な処理がなされてしまうようである。

おわりに――DvorakJにおける無変換キーの発行処理の改善策?

以上より、無変換キーを何らかの形で発行するとBackspaceの処理が現れることが分かった。ただし、現れるといっても、AutohotkeyがBackspaceのキーを発行しているわけではないので、無害ではあるが。

問題はDvorakJを使用中なら当該状況下でBackspaceのキーを意図せずに発行してしまうことだ。無変換キーを発行する処理上で、不要な処理を何か行ってしまっていると考えられる。
そこで、無変換キーのキーフックを外したうえで、上記のような検証を行ってみた。そのログは次の通りである。

VK  SC	Type	Up/Dn	Elapsed	Key
-------------------------------------------
1C  079	 	d	0.06	not found      	
1C  079	 	u	0.11	not found      	
1C  079	i	d	0.02	not found      	
1C  079	i	u	0.00	not found      	
0D  01C	 	d	0.75	Enter          	
0D  01C	i	d	0.00	Enter          	
0D  01C	i	u	0.00	Enter          	
0D  01C	 	u	0.09	Enter          	
1D  07B	 	d	0.45	not found      	
1D  07B	 	u	0.08	not found      	
08  00E	a	d	0.14	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	i	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	i	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	i	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	i	u	0.00	Backspace      	
08  00E	a	d	0.00	Backspace      	
08  00E	a	u	0.00	Backspace      	
08  00E	i	d	0.00	Backspace      	
08  00E	i	u	0.00	Backspace      	
08  00E	i	d	0.00	Backspace      	
08  00E	i	u	0.00	Backspace      	

DvorakJでは、無変換キーを何かしらの手段で発行するときには、VJEスタイルで日本語変換を行うとBackspaceの不要な押し下げと押し上げが生じる。言うまでも無いことだろうが、これは無変換キー以外に原因があることを示唆している。
その原因として何も思いつかないので、対処策が判明次第対応したい。