none
WPF C# IMEを有効にしている状態でF10キーのイベントを取る方法 RRS feed

  • 質問

  • 環境は以下となります。

    • Windows10
    • VisualStudio2017Community
    • C# + WPF アプリケーション

    通常、F10キーのイベントはPreviewKeyDownイベントで受けられるのですが、以下の条件でイベントが発生しなくなってしまいます。

    1. テキストボックスでIMEを有効にしている。
    2. テキストボックス内のテキストを全選択状態にする。

    上記の状態でF10を押下してもPreviewKeyDownイベントが発生しません。F1~F9、F11、F12は発生します。

    なんとかF10キーのイベントを受け取る方法はないでしょうか。

    2018年3月23日 13:45

回答

すべての返信

  • こんな

    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!)

    2018年3月23日 21:42
  • gekka様、回答ありがとうございます。

    ですが、提示して頂いたコードでもテキストボックスに文字入力して適当に選択状態にした後でF10キーを押下すると、やはりIMEの半角英数変換機能だけが動いてイベントは取れていないようです。

    ただF10を2回以上押下すると2回目以降はイベントが取れるという、いやらしい動きをしますね。

    Spy++で見てみるとキーボード関連のメッセージが来てなかったので、これアプリ側でどう足掻いても取れそうにないですね。ちなみにWindows7で確認してみたら普通にイベントが送られてきましたのでWindows10固有の問題なのかと考えています。

    何か方法はあるのでしょうか。(ちょっと諦め気味ですが)

    何れにせよ目に止めて頂いてありがとうございます。

    2018年3月26日 1:24
  • 質問をするときは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
    2018年3月31日 13:31
  • sygh様、返信ありがとうございます。

    示唆頂いたRaw Inputの利用で理想的な動作を得ることができました。ありがとうございます。

    Windows10は、

    エディション  Windows 10 Pro

    バージョン  1709

    OSビルド  16299.309

    .NET Frameworkのバーションは 4.6.1 です。

    >ちなみに、F10キーの入力を検知して、何に使うつもりなのでしょうか?

    ショートカットキーとして利用したい旨クライアントから依頼されていました。

    クライアントがオフコン時代のキー操作を変えたくないと頑なだったため調査しておりました。

    2018年4月2日 9:46