我的WPF应用程序处理键盘按下,特别是#和*字符,就像它是一个VoIP电话一样。
我有一个国际键盘的bug,特别是英式英语键盘。通常情况下,我会监听3键,如果shift键按下,我们就会触发一个事件来做一些事情。然而,在英式键盘上,这是“is”字符。我发现英国的英语键盘有一个专门的“#”键。显然,我们可以只听那个特定的键,但这并不能解决美国英语的情况,它是shift-3键,以及无数其他键盘把它放在其他地方。
长话短说,无论是组合键还是单键,我如何从按键中监听特定的字符并对其做出反应?
发布于 2011-04-29 07:19:40
下面的函数GetCharFromKey(Key key)将完成此操作。
它使用一系列win32调用来解码按下的键:
获取virtual key from WPF key
的
这个old 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;
}发布于 2019-09-25 04:22:43
我在这篇文章中找到了一个有用的解决方案:http://www.codewrecks.com/blog/index.php/2008/05/06/wpf-convert-systemwindowsinputkey-to-char-or-string-2/
还有另一个事件TextInput或PreviewTextInput,它将字符作为字符串,而不是键:)。
https://stackoverflow.com/questions/5825820
复制相似问题