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

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

我有一个错误,虽然与国际键盘,特别是英国的英文键盘。 通常情况下,我听3键,如果换档键修改器closures,我们就开始做一些事情。 但在英式键盘上,这是“英镑”字符。 我发现英国的英文键盘上有一个“#”的专用键。 显然,我们可以只听那个特定的关键字,但是这并不能解决美国的英文是shift-3,所有的无数其他键盘都是这样。

长话短说,我如何从一个按键听某个特定的angular色,无论是一个关键的组合或单一的键,并作出反应呢?

下面的函数,GetCharFromKey(Key key)将执行此操作。

它使用一系列的win32调用来解码被按下的按键:

  1. 从WPF密钥获取虚拟键

  2. 从虚拟键获取扫描码

  3. 得到你的Unicode字符

这个老post更详细地描述了它。

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; }