【问题标题】:C# - Converting KeyPress to scancode/scancode to key nameC# - 将 KeyPress 转换为扫描码/扫描码为键名
【发布时间】:2011-09-24 08:12:03
【问题描述】:

我有一个 WinForm 应用程序,我需要在其中捕获 KeyPress 并为其获取扫描码。除此之外,我还需要转换现有的扫描码 int 键名(也许通过预先转换为虚拟键?)有没有办法做到这一点?

【问题讨论】:

  • KeyPress 为时已晚,您需要在 KeyDown 记录它。然而,KeyEventArgs 并没有公开它,需要覆盖 WndProc 才能捕获 WM_KEYDOWN 消息。

标签: c# winforms .net-2.0


【解决方案1】:

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

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

查看我对this question 的回答,了解一些示例代码和更详细的说明。

【讨论】:

    【解决方案2】:

    如果您仍然需要它,您可以使用反射进行私人成员访问。我知道这不是一个好主意,并且接口可以在下一个版本中更改,但它适用于 .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);
    
        //Use scancode
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多