我正在通过KeyDown事件读取一个键,但是我想尝试通过查看该键将被按下(和打开)键来解释它。有没有办法做到这一点?
我不想以编程方式设置numlock的状态,因为那时我会受到用户的支配并且必须管理该状态。另外,我必须支持任何键盘。
答案 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
基本上会让您第一次有机会在应用程序中捕获任何键输入。您无法做的是猜测键盘硬件的设计方式并将按键发送到操作系统。