VSTOでKeyHook

本文上広告1



やりたいこと

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時点追記)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする