Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何捕获'#';WPF/C#中不同区域设置键盘上的字符?_C#_Wpf_Keypress - Fatal编程技术网

如何捕获'#';WPF/C#中不同区域设置键盘上的字符?

如何捕获'#';WPF/C#中不同区域设置键盘上的字符?,c#,wpf,keypress,C#,Wpf,Keypress,我的WPF应用程序处理键盘按键,特别是#和*字符,因为它是VoIP电话 不过,我对国际键盘,尤其是英式英语键盘有一个缺陷。通常我听3键,如果shift键修改器关闭,我们会触发一个事件来做一些事情。然而,在英国键盘上,这是“;”字符。我发现英国英语键盘上有一个专用的“#”键。很明显,我们可以只听那个特定的键,但这并不能解决我们英语的问题,它是shift-3和所有其他无数的键盘,把它放在其他地方 长话短说,我如何从按键中听到特定的字符,无论是组合键还是单键,并对其作出反应?下面的函数GetCharF

我的WPF应用程序处理键盘按键,特别是#和*字符,因为它是VoIP电话

不过,我对国际键盘,尤其是英式英语键盘有一个缺陷。通常我听3键,如果shift键修改器关闭,我们会触发一个事件来做一些事情。然而,在英国键盘上,这是“;”字符。我发现英国英语键盘上有一个专用的“#”键。很明显,我们可以只听那个特定的键,但这并不能解决我们英语的问题,它是shift-3和所有其他无数的键盘,把它放在其他地方


长话短说,我如何从按键中听到特定的字符,无论是组合键还是单键,并对其作出反应?

下面的函数GetCharFromKey(key-key)将实现这一技巧

它使用一系列win32调用对按下的键进行解码:

  • 得到

  • 得到

  • 得到

  • 这将更详细地描述它

          public enum MapType : uint
          {
             MAPVK_VK_TO_VSC = 0x0,
             MAPVK_VSC_TO_VK = 0x1,
             MAPVK_VK_TO_CHAR = 0x2,
             MAPVK_VSC_TO_VK_EX = 0x3,
          }
    
          [DllImport("user32.dll")]
          public static extern int ToUnicode(
              uint wVirtKey,
              uint wScanCode,
              byte[] lpKeyState,
              [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)] 
                StringBuilder pwszBuff,
              int cchBuff,
              uint wFlags);
    
          [DllImport("user32.dll")]
          public static extern bool GetKeyboardState(byte[] lpKeyState);
    
          [DllImport("user32.dll")]
          public static extern uint MapVirtualKey(uint uCode, MapType uMapType);
    
          public static char GetCharFromKey(Key key)
          {
             char ch = ' ';
    
             int virtualKey = KeyInterop.VirtualKeyFromKey(key);
             byte[] keyboardState = new byte[256];
             GetKeyboardState(keyboardState);
    
             uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC);
             StringBuilder stringBuilder = new StringBuilder(2);
    
             int result = ToUnicode((uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0);
             switch (result)
             {
                case -1: 
                   break;
                case 0: 
                   break;
                case 1:
                   {
                      ch = stringBuilder[0];
                      break;
                   }
                default:
                   {
                      ch = stringBuilder[0];
                      break;
                   }
             }
             return ch;
          }
    

    我在这篇文章中找到了一个有用的解决方案:


    还有另一个事件
    TextInput
    previewTimeInput
    ,它将字符作为字符串而不是键:)。

    对于不生成文本字符的键,它实际上应该返回
    '\0'
    ,或者
    (char?).null
    。上面提到的“旧帖子”现在不见了,但仍可以在此处访问:。对于记录,WinForms版本为,它需要引用程序集WindowsBase,然后使用System.Windows.Input;有人把这个放在NuGet软件包里了吗?