C#-将按键转换为扫描码/扫描码转换为键名

C#-将按键转换为扫描码/扫描码转换为键名,c#,winforms,.net-2.0,C#,Winforms,.net 2.0,我有一个WinForm应用程序,需要捕获一个按键并获取它的扫描代码。除此之外,我还需要转换现有的扫描码int键名(可能通过事先转换为虚拟键?)有什么方法可以实现这一点吗?第一部分是可能的,但很棘手,因为多个虚拟键(VK)代码将映射到同一扫描码(取决于键盘的shift/ctrl/alt状态) 我不确定你所说的“键名”是什么意思,但如果你指的是物理键盘布局,那么下一步,你需要根据标准物理键盘布局(101键、102键等)对键的位置做出一些假设 有关一些示例代码和更详细的说明,请参见我的答案。如果您仍然

我有一个WinForm应用程序,需要捕获一个按键并获取它的扫描代码。除此之外,我还需要转换现有的扫描码int键名(可能通过事先转换为虚拟键?)有什么方法可以实现这一点吗?

第一部分是可能的,但很棘手,因为多个虚拟键(VK)代码将映射到同一扫描码(取决于键盘的shift/ctrl/alt状态)

我不确定你所说的“键名”是什么意思,但如果你指的是物理键盘布局,那么下一步,你需要根据标准物理键盘布局(101键、102键等)对键的位置做出一些假设


有关一些示例代码和更详细的说明,请参见我的答案。

如果您仍然需要它,您可以使用反射进行私人成员访问。我知道这不是一个好主意,接口可以在下一个版本中更改,但它适用于.NETFramework4.6

private void OnKeyDown(object sender, KeyEventArgs e)
{
    MSG l_Msg;
    ushort l_Scancode;
    PresentationSource source = e.InputSource;

    var l_MSGField = source.GetType().GetField("_lastKeyboardMessage", BindingFlags.NonPublic | BindingFlags.Instance);
    l_Msg = (MSG)l_MSGField.GetValue(source);
    l_Scancode = (ushort)(l_Msg.lParam.ToInt32() >> 16);

    //Use scancode
}

@蒂格兰,按键太晚了,你需要在按键时录下来。但是KeyEventArgs不公开它,需要重写WndProc来捕获WM_KEYDOWN消息。