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

问题描述 投票:1回答:2

我有一个WinForm应用程序,我需要在其中捕获KeyPress并为其获取扫描代码。与此同时,我需要转换现有的扫描代码int密钥名称(也许是通过预先转换为虚拟密钥?)有什么方法可以完成此操作?

c# winforms .net-2.0
2个回答
0
投票

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

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

请参见我对this question的回答以获取一些示例代码和更详细的描述。


0
投票

如果仍然需要,则可以使用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);
}
© www.soinside.com 2019 - 2024. All rights reserved.