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