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