tmytのらくがき

個人の日記レベルです

SylphyHornのIssue #19の件

これはメモです。

TL;DR

  • SylphyHornというよりOpen.WinKeyboadHookというライブラリの問題
  • ToUnicodeExがKernel-mode Keyboard Bufferを変更するというSideEffectがある

問題

github.com

要約すると、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).

ToUnicodeEx function (Windows)

しれっとびっくり大事件。SideEffectとかやめてよ、これいったいどうすればいいの。ということで今日はここまで。あくまでもメモです。