やりたいこと
VSTOにて、キーボードで何のキーが押されたかをしりたい。
VSTOでキーイベントを取得したい。
調査結果
VSTOでは直接Keyup,KeyDownは取得できない
WinForm,WPFならたいていKeyUp,KeyDownがあるのですが、なぜだかVSTO(ユーザーコントロールも同じ)では取得できません。”VSTO Keydown”等で検索すると、ここら辺にあたります。みなさん同じことを考えますよね。
代替案として、KeyHookを使う
上記のStackoverflowのQAでも提案されているので、そちらが最適のようです。
そのリンク先から紹介されているように、Detecting text changes in Word 2016 from VSTO add-inが参考になります。
VSTOでKeyHookを実際にやってみる(WH_KEYBOARD)
Detecting text changes in Word 2016 from VSTO add-inのAnswer側のように、なぜWH_KEYBOARDを使うとうまくいき、Question側のWH_KEYBOARD_LLを使ったLowLevelフックではうまくいかないのか、わかりません。
Visual Studio 2017, Win10 , Excel 2016でやってみた結果
- WH_KEYBOARD_LL(LowLevelフック)は、Excel以外のキーフックは確実に入ってくるが、Excelでのキー入力は入ってこない。
- WH_KEYBOARDは、Excelでのキー入力も入ってきますが、一つのKeydownで5回程度のイベントが発生する。扱いにくい。(上記Detectin…VSTO add-inの下の方で、diffplex使ったよという気持ちがよくわかります。)
結論
VSTOにて、キーボードで何のキーが押されたかをしりたい場合は、
- VSTOでは、KeyUp,KeyDownは直接取れない。
- WH_KEYBOARDでのKeyHookを行う。
- WH_KEYBOARDでは,連続5回程度のイベントが発生するのでさらに工夫が必要。
となります。ご参考になれば幸いです。また工夫ができたら、ご報告したいと思います。
追伸
早起きしたので…
朝5時に目が覚めたので、再度寝れるように、知りたかったけど知らなくて、難しそうなRx(Reactive Extension)について調べたら、有用な情報があった。
GitHubで、C#でRxを使ったGlobalKeyhookライブラリこれなんかMITライセンスだし、めっちゃ使えそう。これ自体のサンプルだけを動かしてみたけど、良い感じだった。とりあえず、メモしたので寝よう。(2018/06/24時点追記)