トップ回答者
WPF C# IMEを有効にしている状態でF10キーのイベントを取る方法

質問
-
回答
-
質問をするときはWindows 10の詳細なバージョンや、.NETのバージョンに関しても記載するようにしてください。
おそらくRaw Input機能を使えば、WM_INPUTにて入力情報を受け取れると思います。
ただしC#からRaw Inputを利用する場合はP/Invokeが必要となります。
Using Raw Input from C# to handle multiple keyboards - CodeProject
ちなみに、F10キーの入力を検知して、何に使うつもりなのでしょうか?
- 回答としてマーク Kabe64 2018年4月2日 9:46
すべての返信
-
こんな
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace WpfApp1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); System.Windows.Input.InputManager.Current.PreProcessInput += CurrentInputManager_PreProcessInput; this.PreviewKeyDown += MainWindow_PreviewKeyDown; TextBox txb = new TextBox(); InputMethod.SetIsInputMethodEnabled(txb, true); this.Content = txb; txb.PreviewKeyDown += TextBox_PreviewKeyDown; } private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e) { DebugWriteLine(e); } private void MainWindow_PreviewKeyDown(object sender, KeyEventArgs e) { DebugWriteLine(e); } private void CurrentInputManager_PreProcessInput(object sender, PreProcessInputEventArgs e) { if (e.StagingItem != null && e.StagingItem.Input != null) { var input = e.StagingItem.Input; var dev = input.Device; if (dev != null) { var kd = dev as System.Windows.Input.KeyboardDevice; if (kd != null) { var keyevent = input as System.Windows.Input.KeyEventArgs; if (keyevent != null) { if (keyevent.RoutedEvent == System.Windows.Input.Keyboard.PreviewKeyUpEvent) { DebugWriteLine(keyevent); } if (keyevent.Key == Key.System && keyevent.SystemKey == Key.F10) { //keyevent.Handled = true; } } } } } } private static void DebugWriteLine(System.Windows.Input.KeyEventArgs e, [System.Runtime.CompilerServices.CallerMemberName]string name = "") { System.Diagnostics.Debug.WriteLine(name + "\t"+ e.Key + (e.Key == Key.System ? "(" + e.SystemKey + ")" : "")); } } }
#全選択では再現しない・・・個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
-
gekka様、回答ありがとうございます。
ですが、提示して頂いたコードでもテキストボックスに文字入力して適当に選択状態にした後でF10キーを押下すると、やはりIMEの半角英数変換機能だけが動いてイベントは取れていないようです。
ただF10を2回以上押下すると2回目以降はイベントが取れるという、いやらしい動きをしますね。
Spy++で見てみるとキーボード関連のメッセージが来てなかったので、これアプリ側でどう足掻いても取れそうにないですね。ちなみにWindows7で確認してみたら普通にイベントが送られてきましたのでWindows10固有の問題なのかと考えています。
何か方法はあるのでしょうか。(ちょっと諦め気味ですが)
何れにせよ目に止めて頂いてありがとうございます。
-
質問をするときはWindows 10の詳細なバージョンや、.NETのバージョンに関しても記載するようにしてください。
おそらくRaw Input機能を使えば、WM_INPUTにて入力情報を受け取れると思います。
ただしC#からRaw Inputを利用する場合はP/Invokeが必要となります。
Using Raw Input from C# to handle multiple keyboards - CodeProject
ちなみに、F10キーの入力を検知して、何に使うつもりなのでしょうか?
- 回答としてマーク Kabe64 2018年4月2日 9:46
-
sygh様、返信ありがとうございます。
示唆頂いたRaw Inputの利用で理想的な動作を得ることができました。ありがとうございます。
Windows10は、
エディション Windows 10 Pro
バージョン 1709
OSビルド 16299.309
.NET Frameworkのバーションは 4.6.1 です。
>ちなみに、F10キーの入力を検知して、何に使うつもりなのでしょうか?
ショートカットキーとして利用したい旨クライアントから依頼されていました。
クライアントがオフコン時代のキー操作を変えたくないと頑なだったため調査しておりました。