如何使用 c# 将密钥转换为数字锁定密钥

本文关键字:密钥 数字 锁定 转换 何使用 | 更新日期: 2023-09-27 18:20:28

我正在通过KeyDown事件读取一个键,但是我想尝试通过查看按下数字锁(和打开(该键来解释它。 有没有办法做到这一点?

我不想以编程方式设置 numlock 的状态,因为那样我就会受到用户的摆布,并且必须管理该状态。 另外,我必须支持任何键盘。

如何使用 c# 将密钥转换为数字锁定密钥

解释键盘输入有多个级别。

在一个层面上,你会得到字符 - 所以如果用户按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基本上会让您第一次有机会捕获应用程序中的任何关键输入。您将无法做的是猜测键盘硬件的设计方式并将按键发送到操作系统。