我有一个WinForm应用程序,我需要在其中捕获KeyPress并为其获取扫描代码。与此同时,我需要转换现有的扫描代码int密钥名称(也许是通过预先转换为虚拟密钥?)有什么方法可以完成此操作?
第一部分是可能的,但很棘手,因为多个虚拟键(VK)代码将映射到相同的扫描代码(取决于键盘的shift / ctrl / alt状态)。
我不确定您所说的“键名”是什么意思,但是,如果要指代物理键盘布局,那么下一步,您将需要根据标准物理键盘对键的位置进行一些假设。布局(101键,102键等)。
请参见我对this question的回答以获取一些示例代码和更详细的描述。
如果仍然需要,则可以使用Reflection进行私有成员访问。我知道这不是一个好主意,并且接口可以在下一个版本中更改,但它适用于.Net Framework 4.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);
m_Host.KeyData(l_Scancode);
}