瑞士键盘处理困难'+'

本文关键字:键盘 处理 | 更新日期: 2023-09-27 17:53:03

我在工作中做一个项目,我有点难住了。我们有一个图形显示器,它处理键盘输入,并在numpad上的+或等号键上方的+被按下时放大显示。它在大多数计算机上都能很好地工作,但在瑞士(德国)布局上,+键代替Shift+1。我们目前正在使用OnKeyDown,它返回按下的键值(如果我试图处理瑞士+,则"1"键值为49)以及指示是否按下shift, control和alt键的布尔变量。我看过使用OnKeyPress,但我似乎失去了检查控制键是否按在那里的能力。

我可能有一个潜在的解决方案,如何捕捉'#'字符在不同的语言环境键盘在WPF/c# ?但是,无论键盘设置为何种语言,导入外部dll来正确地本地化键盘以使用相同的+键似乎都非常不优雅。我愿意相信,自2012年以来,微软已经在c#语言中添加了一些原生的东西来处理外国布局的键盘输入,而不需要跳圈。

更糟的是,我总是可以检测到正在使用的键盘布局,并将其作为特殊情况处理,但这似乎是最后的手段。

. net中键盘映射的代码稍微有用一些,但它有一些脆弱的地方,比如访问其边界外的数组,如果它得到Keys.Shift而不是Keys.ShiftKey,它仍然需要拉入外部DLL。这真的是微软认为不重要的事情吗?

Edit:我想我已经把它与上面关于"。net中的键盘映射"的代码一起工作了。我得到了正确的值,为所有的键访问按下shift和一个键。我有点担心我会错过其他一些情况,包括添加Control或Alt到它,但它的功能。我还是希望有一个更优雅的解决方案。

进一步编辑:在Control.KeyDown上获取字符的技术?也适用于给定的控件。

后期编辑 :正确。它正常工作,但看起来我的错误总是更简单。在事件中,非numpad的"plus"应该始终映射到KeyCode的Keys.Oemplus,无论按下哪个按钮触发它。瑞士键盘和其他我还没找到的键盘都没有。有趣。我不知道该在哪里报告

瑞士键盘处理困难'+'

最后,我使用了如何根据当前键盘布局将虚拟键代码转换为字符的代码?我仍然认为这应该更容易构建到代码中,但现在应该足够了。

  [DllImport("user32.dll")]
  public static extern int ToUnicode(
      uint wVirtKey,
      uint wScanCode,
      byte[] lpKeyState,
      [Out, MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 4)] 
        StringBuilder pwszBuff,
      int cchBuff,
      uint wFlags);
  static string GetCharsFromKeys(Keys keys, bool shift, bool altGr)
  {
     var buf = new StringBuilder(256);
     var keyboardState = new byte[256];
     if (shift)
        keyboardState[(int)Keys.ShiftKey] = 0xff;
     if (altGr)
     {
        keyboardState[(int)Keys.ControlKey] = 0xff;
        keyboardState[(int)Keys.Menu] = 0xff;
     }
     ToUnicode((uint)keys, 0, keyboardState, buf, 256, 0);
     return buf.ToString();
  }