如何使用c#将密钥转换为num lock密钥

时间:2015-11-04 13:26:02

标签: c# winforms

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

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

2 个答案:

答案 0 :(得分:3)

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

在一个级别上,您会获得字符 - 因此,如果用户按下F,您将获得一个字符f。如果用户按下Shift+F,您将获得F。同样,如果用户在启用了numlock的情况下按Num 8,您将获得8(就像他按下字母数字8一样) - 但如果他按下{{ 1}} 没有打开numlock,你什么也得不到。

在另一个级别,您可以获得。如果用户按下Num 8,您将获得F。如果他按下Keys.F,则会获得Shift+F。在数字键盘上,按下Shift+F按下numlock会给你Num 8(与字母数字Num 8不同) - 但按下numlock off会给你8

在.NET中,键盘的这两个视图由字符的Up事件和键的KeyPress / KeyDown事件公开。

但请注意,两者中的 都不允许您按照自己的方式重新解释数字小键盘!例如,在我的键盘上,同时按下KeyUp键并按住Up并使用numlock offs可以获得相同的密钥 - 这是因为他们 在逻辑上是相同的

更重要的是,不同的键盘工作方式不同。例如,许多笔记本电脑键盘在字母数字键盘上都有它们的小键盘。因此,如果您的numlock已关闭,则以前为Num 8的相同密钥现在为Num 8或类似的密钥。适应奇怪的键盘布局与为每个键盘编写驱动程序基本相同 - 你真的不想这样做。

答案 1 :(得分:0)

我做了一个小测试项目并覆盖了ProcessCmdKey以捕获任何键盘输入。我有一个带额外NumPad的标准键盘。当我按下启用NumPad的数字键时,我将NumPadX设为keyData,当我禁用NumLock并再次按下其中一个键时,按下4键时我会得到例如Left。所有可能的值都可以在Keys枚号中找到 覆盖ProcessCmdKeymethod基本上会让您第一次有机会在应用程序中捕获任何键输入。您无法做的是猜测键盘硬件的设计方式并将按键发送到操作系统。