情報:Windowsのキー回りイベント のバックアップソース(No.3)

お名前:

仮ページ。あとで別の方法でまとめる・・・かも。

*きっかけ。 [#ic8a6192]
いろいろ作っていて、かな漢にかかわったふるまいを確認したかった。

ぶっちゃけ、ヒストリ機能を作ろうと思っていて。~
でも TextChanged だけだとヒストリ的に親切じゃなさそうだったので。

*調査の前提 [#ref70802]
TextBoxコントロールで、下記のイベントを監視した。~
KeyDown, KeyUp, KeyPress, TextChanged.

**かな漢なし動作 [#c47765b8]
#region(単純に「aiueo」とキー入力した際のふるまい。)
単純に「aiueo」とキー入力した際のふるまい。
 2016/06/11 8:56:12 KeyDown[A] code[65]
 2016/06/11 8:56:12 KeyPress[a] 
 2016/06/11 8:56:12 TextChanged.
 2016/06/11 8:56:12 KeyUp[A]  ← Down,Press,Changed,Up というのが1キーの動作といえる。
 2016/06/11 8:56:12 KeyDown[I] code[73]
 2016/06/11 8:56:12 KeyPress[i]
 2016/06/11 8:56:12 TextChanged.
 2016/06/11 8:56:12 KeyUp[I] 
 2016/06/11 8:56:12 KeyDown[U] code[85]
 2016/06/11 8:56:12 KeyPress[u]
 2016/06/11 8:56:12 TextChanged.
 2016/06/11 8:56:12 KeyUp[U]
 2016/06/11 8:56:13 KeyDown[E] code[69]
 2016/06/11 8:56:13 KeyPress[e]
 2016/06/11 8:56:13 TextChanged.
 2016/06/11 8:56:13 KeyUp[E]
 2016/06/11 8:56:14 KeyDown[O] code[79]
 2016/06/11 8:56:14 KeyPress[o]
 2016/06/11 8:56:14 TextChanged.
 2016/06/11 8:56:14 KeyUp[O]

***ポイント [#f827d6f6]
キー1回ごとに以下の一連の流れが発生する。

&color(RED){KeyDown[A] code[65]};~
&color(RED){KeyPress[a] };~
&color(RED){TextChanged.};~
&color(RED){KeyUp[A]};~
#endregion

**かな漢あり動作、その1 [#j139d98a]
#region(かな漢を使って「aiueo」キー入力→変換せずに「あいうえお」入力。)
かな漢を使って「aiueo」キー入力→「あいうえお」状態でただEnter入力。
 2016/06/11 8:56:12 KeyDown[A] code[65]
 2016/06/11 8:56:34 KeyDown[ProcessKey] code[229]
 2016/06/11 8:56:34 KeyUp[A] ← かな漢なしと比べると Press,Change がない。
 2016/06/11 8:56:34 KeyDown[ProcessKey] code[229]
 2016/06/11 8:56:34 KeyUp[I]
 2016/06/11 8:56:35 KeyDown[ProcessKey] code[229]
 2016/06/11 8:56:35 KeyUp[U]
 2016/06/11 8:56:36 KeyDown[ProcessKey] code[229]
 2016/06/11 8:56:36 KeyUp[E]
 2016/06/11 8:56:37 KeyDown[ProcessKey] code[229]
 2016/06/11 8:56:37 KeyUp[O]
 2016/06/11 8:56:41 KeyDown[ProcessKey] code[229] ← EnterキーDown *1
 2016/06/11 8:56:41 KeyPress[あ]
 2016/06/11 8:56:41 KeyPress[い]
 2016/06/11 8:56:41 KeyPress[う]
 2016/06/11 8:56:41 KeyPress[え]
 2016/06/11 8:56:41 KeyPress[お] ← 以上5回のKeyPressが変則に見える。
 2016/06/11 8:56:41 KeyPress[あ]
 2016/06/11 8:56:41 TextChanged. ←1文字ずつ Press,Change が続く
 2016/06/11 8:56:41 KeyPress[い]
 2016/06/11 8:56:41 TextChanged.
 2016/06/11 8:56:41 KeyPress[う]
 2016/06/11 8:56:41 TextChanged.
 2016/06/11 8:56:41 KeyPress[え]
 2016/06/11 8:56:41 TextChanged.
 2016/06/11 8:56:41 KeyPress[お]
 2016/06/11 8:56:41 TextChanged.
 2016/06/11 8:56:41 KeyUp[Return] ← 上記*1 のEnterDownに対応。

***ポイント [#p6d76582]
かな漢なしでの「Down, Press, Changed, Up」の流れと比較して検討。

-変換前の入力では、DownとUpしか受け取れない。
--加えて、Down時には「何が押されたか」もわからない。~
Up時にはわかる。
-確定入力の「Enter」について
--Down時は、上記同様に「何がおされたか」わからない。
--Enter入力によって確定すると、KeyPressとTextChangeが発生するが、それも変則的。
--まず「確定された文字すべて」が1文字ずつ入力されたかのようにPressが発生する。~
---上記だと「あいうえお」の5文字が一気に押されたようなイベント発生 *A
--そののち「1文字づつ」Press→Change が発生。
--すべてのChanged が終わった後、「Enter]のUpが発生する。

上記の *A 部分だけ気にしなければ、比較的わかりやすい。


#endregion
**かな漢あり動作、その2 [#d768381a]
#region(かな漢を使って「aiueo」入力→変換操作で「アイウエオ」入力。)
かな漢を使って「aiueo」キー入力→変換操作+Enterで「アイウエオ」入力。
 2016/06/11 8:57:26 KeyDown[ProcessKey] code[229]
 2016/06/11 8:57:27 KeyUp[A]
 2016/06/11 8:57:28 KeyDown[ProcessKey] code[229]
 2016/06/11 8:57:28 KeyUp[I] 
 2016/06/11 8:57:28 KeyDown[ProcessKey] code[229]
 2016/06/11 8:57:28 KeyUp[U] 
 2016/06/11 8:57:29 KeyDown[ProcessKey] code[229]
 2016/06/11 8:57:29 KeyUp[E] 
 2016/06/11 8:57:30 KeyDown[ProcessKey] code[229]
 2016/06/11 8:57:30 KeyUp[O] 
 2016/06/11 8:57:34 KeyDown[ProcessKey] code[229] ←変換用Space。ここは「変換範囲確定」時。
 2016/06/11 8:57:34 KeyUp[Space]
 2016/06/11 8:57:36 KeyDown[ProcessKey] code[229] ←変換用Space。ここは1回目の変換。
 2016/06/11 8:57:36 KeyUp[ProcessKey]
 2016/06/11 8:57:38 KeyDown[ProcessKey] code[229] ←変換用Space、2回目の変換
 2016/06/11 8:57:38 KeyUp[ProcessKey] 
 2016/06/11 8:57:41 KeyDown[ProcessKey] code[229] ← 確定Enter
 2016/06/11 8:57:41 KeyPress[ア]
 2016/06/11 8:57:41 KeyPress[イ]
 2016/06/11 8:57:41 KeyPress[ウ]
 2016/06/11 8:57:41 KeyPress[エ]
 2016/06/11 8:57:41 KeyPress[オ]
 2016/06/11 8:57:41 KeyPress[ア]
 2016/06/11 8:57:41 TextChanged.
 2016/06/11 8:57:41 KeyPress[イ]
 2016/06/11 8:57:41 TextChanged.
 2016/06/11 8:57:41 KeyPress[ウ]
 2016/06/11 8:57:41 TextChanged.
 2016/06/11 8:57:41 KeyPress[エ]
 2016/06/11 8:57:41 TextChanged.
 2016/06/11 8:57:41 KeyPress[オ]
 2016/06/11 8:57:41 TextChanged.
 2016/06/11 8:57:41 KeyUp[Return]

***ポイント [#ta405940]
かな漢あり1と比べた差は変換操作だけ。

変換をSpaceキーで実施したが、イベントを見る限りでは
「普通の文字入力」同様の「何かDown」→「Space のUp」が起きているだけ。

ここには載せていないが、変換範囲を切り替えるときの「←」「→」キーも同じ。


こう見るとKeyPress・TextChanged がくるまでは「かな漢上の問題」と割り切るのがよさそう。



#endregion

**かな漢あり動作、その3 [#db441e13]
#region(「ai」入力→変換Space→「ueo」キー入力。)
変換終わった後にEnterで確定するのではなく、「次の文字を入力」することで、前の入力を確定した場合。

今回の例では
+ai キー入力
--かな漢上「あい」が変換中。
+Spaceキー変換操作。
--かな漢上は「愛」表示、まだ確定していない(Space押せばまた次の候補になる状態)
+u キー入力。
--「愛」確定。かな漢上は「う」が変換中。

 2016/06/11 8:58:45 KeyDown[ProcessKey] code[229]
 2016/06/11 8:58:45 KeyUp[A] 
 2016/06/11 8:58:46 KeyDown[ProcessKey] code[229]
 2016/06/11 8:58:47 KeyUp[I] 
 2016/06/11 8:58:47 KeyDown[ProcessKey] code[229]
 2016/06/11 8:58:47 KeyUp[Space]  ←変換操作
 2016/06/11 8:58:49 KeyDown[ProcessKey] code[229] ←「u」のdown。
 2016/06/11 8:58:49 KeyPress[愛]
 2016/06/11 8:58:49 TextChanged.
 2016/06/11 8:58:49 KeyUp[U]


***ポイント [#i5e30444]
変換を確定されたイベントが 「u」になっている:
Enter確定された場合の「謎KeyDown」「Enter Up」と比べると、~
今回は「謎KeyDown」「u Up」になっているだけで動きは変わらない。



#endregion

お名前: