【发布时间】:2014-05-03 19:13:01
【问题描述】:
我正在做一个工作项目,我有点难过。我们有一个图形显示,它处理键盘输入并在按下数字键盘上的+ 或等于键上方的+ 时放大显示。它在大多数计算机上运行良好,但在瑞士(德国)布局上,+ 键改为Shift+1。我们目前正在使用OnKeyDown,它返回被按下的键值(如果我试图处理瑞士+,则'1'键值为49)以及指示是否移位、控制、和 alt 键被按下。我看过使用 OnKeyPress,但我似乎无法检查那里是否按下了 Control 键。
我可能在how to capture the '#' character on different locale keyboards in WPF/C#? 有一个潜在的解决方案,但拉入外部DLL 以正确本地化键盘以使用+ 键,无论键盘设置为哪种语言似乎都非常不雅。我愿意相信,自 2012 年以来,Microsoft 已经在 C# 语言中添加了一些本机功能,以处理外国布局中的键盘输入,而不会跳槽。
更糟的是,我总能检测出正在使用哪种键盘布局并将其作为特殊情况处理,但这似乎是不得已而为之的事情。
Keyboard Mapping in .NET 处的代码稍微有用一些,但它有一些脆弱的地方,比如如果它得到Keys.Shift 而不是Keys.ShiftKey,则访问其边界之外的数组,它仍然需要拉入外部DLL。这真的是微软认为不重要的事情吗?
编辑:我认为我可以使用上面关于“.NET 中的键盘映射”的代码。我得到了通过按 shift 和一个键访问的所有键的正确值。我有点担心我会错过其他一些涉及向其添加 Control 或 Alt 的案例,但它可以正常工作。我还是更喜欢更优雅的解决方案。
进一步编辑:Get the char on Control.KeyDown? 的技术也适用于给定控件。
稍后编辑:没错。它按应有的方式运行,但看起来我的错误总是更简单。非数字键盘“加号”应始终映射到 Keys.Oemplus 的 KeyCode,无论按下什么按钮触发它。它不适用于瑞士键盘以及我尚未找到的其他键盘。有趣的。我什至不知道我会在哪里报告。
【问题讨论】:
标签: c# winforms localization keyboard