我正尝试使用MapVirtualKey
Windows函数从Windows Forms
应用程序中的虚拟键代码中获取键盘扫描代码。在P的声明/调用的东西是:获取箭头键的正确键盘扫描代码
private const uint MAPVK_VK_TO_VSC = 0;
[DllImport("user32.dll",
CallingConvention = CallingConvention.StdCall,
CharSet = CharSet.Unicode,
EntryPoint = "MapVirtualKey",
SetLastError = true,
ThrowOnUnmappableChar = false)]
private static extern uint MapVirtualKey(
uint uCode,
uint uMapType);
我已重写我的申请主窗口类的OnPreviewKeyDown
方法(从System.Windows.Forms.Form
衍生);在这里,我将给定PreviewKeyDownEventArgs
对象的KeyCode
属性的值并将其传递给MapVirtualKey
方法(我假定该值实际上是一个虚拟键代码)。
protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
{
uint uCode = (uint)e.KeyCode;
uint scanCode = MapVirtualKey(uCode, MAPVK_VK_TO_VSC);
this.HandleScanCode(scanCode);
base.OnPreviewKeyDown(e);
}
问题是我收到了箭头键的错误扫描码(我接受了数字键盘箭头键的扫描码)。例如,如果向上箭头键被按下,我期望扫描码是200而不是72.
等待,你在哪里得到200计算出来的?无论您是按下实际的上键还是数字键盘键,上箭头键的扫描码都是0x48(十进制72)。 (区别在于前者的前缀是一个0xE0,Windows在各种低级别Windows API键盘消息的wParam中变成了一点).Windows始终使用scancode set 1; 200(0xC8)似乎没有映射到任何扫描码。或者我错过了在这种情况下应该设置高位的东西? – andlabs
@andlabs看看这个:http://minecraft.gamepedia.com/Key_codes – Matze
@Matze我找不到这些代码超出这个答案,但奇怪的是,他们用于GTAV。 –