如何使用 c# 将密钥转换为数字锁定密钥
本文关键字:密钥 数字 锁定 转换 何使用 | 更新日期: 2023-09-27 18:20:28
我正在通过KeyDown事件读取一个键,但是我想尝试通过查看按下数字锁(和打开(该键来解释它。 有没有办法做到这一点?
我不想以编程方式设置 numlock 的状态,因为那样我就会受到用户的摆布,并且必须管理该状态。 另外,我必须支持任何键盘。
解释键盘输入有多个级别。
在一个层面上,你会得到字符 - 所以如果用户按F
,你会得到一个字符f
。如果用户按 Shift+F
,您将获得F
。同样,如果用户在打开数字锁的情况下按Num 8
,你会得到8
(就像他按字母数字8
一样( - 但如果他在没有打开数字锁的情况下按Num 8
,你将什么也得不到。
在另一个层面上,你得到钥匙。如果用户按 F
,您将获得Keys.F
。如果他按Shift+F
,你会得到Shift+F
。在数字键盘上,按 Num 8
并打开数字锁定会给您Num 8
(不同于字母数字8
( - 但在关闭数字锁定的情况下按下它会让您Up
。
在 .NET 中,键盘的这两个视图由字符的 KeyPress
事件和键的 KeyDown
/KeyUp
事件公开。
但是,请注意,两者都不允许您按照您想要的方式重新解释数字键盘!例如,在我的键盘上,按 Up
键和按 Num 8
键和数字锁定都会给你相同的键 - 那是因为它们在逻辑上是相同的。
更重要的是,不同的键盘工作方式不同。例如,许多笔记本电脑键盘的字母数字键盘上都有其数字键盘。因此,如果您的数字锁已关闭,则过去Num 8
的相同键现在是I
或类似的东西。适应奇怪的键盘布局基本上与为每个键盘编写驱动程序相同 - 你真的不想这样做。
我做了一个小测试项目,并覆盖了ProcessCmdKey以捕获任何键盘输入。我有一个带有额外数字键盘的标准键盘。当我在启用 NumPad 的情况下按下数字键时,我会得到 NumPadX 作为keyData
,当我禁用 NumLock 并再次按下其中一个键时,我只会得到例如Left
时按下 4 键。所有可能的值都可以在键枚举
中找到覆盖ProcessCmdKeymethod
基本上会让您第一次有机会捕获应用程序中的任何关键输入。您将无法做的是猜测键盘硬件的设计方式并将按键发送到操作系统。