88050


C#のWindowsForm上にWebView2を配置した際に、WebView内にKeyイベントを取られている？ようで、WindowsFormのキーイベントが取得できないのですが、何か方法あるでしょうか。  
FormのKeyPreviewプロパティをtrueにするなども試してみましたが、うまくいきませんでした。

textbox等配置し、そこにカーソルを合わせれば取得できるのですが、介さずに行いたいです。

宜しくお願いします。


CC BY-SA 4.0
2022-03-17T07:19:44.557
86870
2022-03-27T16:32:57.003
19580
question
c# winforms
Microsoft.Web.WebView2をWindowsフォーム上に配置した際のKeyイベントの取得


おそらく単なるプロパティ設定やイベントハンドラ登録などではキーボードイベントを取得出来ないようです。

コメントにて提示したものを含むこれらの記事とかに記載されているSetWindowsHookExを使ったLowLevelKeyboardProcの登録で取得することが出来るでしょう。

日本語の記事で分かりやすいが、イベントハンドラを独自形式で呼び出すので、そのままコピーしただけではイベント通知を処理済みには出来ないもよう。  
キーボードイベントの通知を受けるだけならそのまま使える。  
[C#でグローバルキーフックをする方法](https://lets-csharp.com/keyboard-hook/)

英語の記事でソースコードの取得にはユーザー登録(無料)が必要だが、通常のキーボードイベントと同様に、イベント通知を処理済みにして以後のハンドラに渡さない対処が出来るもよう。  
[A Simple C# Global Low Level Keyboard
Hook](https://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-
Keyboard-Hook)

上記記事は長いソースコードが提示されていたり、ユーザー登録が必要なサイトだったりするので、内容のコピーは差し控えます。  
記事を参照して確かめてみてください。  
試しに最初の記事内容をコピーして使ってみたところでは、キーボードイベントが通知されました。

* * *

そしてLowLevelKeyboardProcのため、自分がアクティブでなくてもキーボードイベントは通知されてしまいます。  
それに対しては、イベントハンドラの最初に自分自身のフォームがアクティブウインドウかの判定を入れて、自分自身なら対応する処理を行うようにすれば良いでしょう。  
[[C#]自分がアクティブウィンドウかどうかを取得する](https://tinq.hatenablog.com/entry/2011/11/18/193341)

>
[code]

>     if (Form.ActiveForm == this)
>     {
>      //アクティブ
>     }
>  
[/code]

* * *

ちなみにキーボードフックなどを使う場合に注意する必要がある事項をまとめた記事があったので、紹介しておきます。  
[Windowsのフックのはまりどころ備忘録](https://qiita.com/kob58im/items/df01765c5059f725174c)


CC BY-SA 4.0
2022-03-27T16:32:57.003
88050
2022-03-27T16:32:57.003
26370
86870
answer