これはメモです。
TL;DR
- SylphyHornというよりOpen.WinKeyboadHookというライブラリの問題
- ToUnicodeExがKernel-mode Keyboard Bufferを変更するというSideEffectがある
問題
要約すると、Alt+Right押してAltを離したタイミングで♠が入力されるんだよね…というなぞ現象。
とりあえず調べてみたところ
この現象は、"Unicode対応ではないプログラムの言語"のロケールがEN-USの時に発生している。JA-JPの場合だと、Alt押しながらRight,RightのあとAlt離すで'B'が入力されるので同様の現象を確認可能。 すべての入力可能コントロールで起きるわけではなく、R#を有効にしたVisual Studioや、Explorer、Internet Explorerのアドレスバーで発生を確認。
Spy++でみてみると、SylphyHornを起動していない場合
- WM_SYSKEYDOWN
- WM_SYSKEYDOWN
- WM_SYSKEYUP
- WM_KEYUP
とメッセージが流れてくることに対して、SylphyHornを起動してると
- WM_SYSKEYDOWN
- WM_SYSKEYDOWN
- WM_SYSKEYUP
- WM_KEYUP
- WM_CHAR
と謎のWM_CHARが出現。いったいこれはなんぞや。
原因はOpen.WinKeyboadHookにあるのでは
SylphyHornがキーフックする際に、Open.WinKeyboadHookというライブラリを使ってるのでこっちが原因じゃないの?って調べてみると、このライブラリの中のToUnicodeという関数のどこかがトリガーとなってWM_CHARが生成されてしまっているみたい。
もっと調べてみるとToUnicodeExというWin32 APIを呼び出したことがトリガーとなっていることが分かった。そこでMSDN(英語)を読んでみると、下のほうにちょろっとだけ書いてあるこれ。
As ToUnicodeEx translates the virtual-key code, it also changes the state of the kernel-mode keyboard buffer. This state-change affects dead keys, ligatures, alt+numpad key entry, and so on. It might also cause undesired side-effects if used in conjunction with TranslateMessage (which also changes the state of the kernel-mode keyboard buffer).
しれっとびっくり大事件。SideEffectとかやめてよ、これいったいどうすればいいの。ということで今日はここまで。あくまでもメモです。