我已经看到了许多建议使用Keyboard.Modifiers
来确定KeyDown
事件是否针对具有修饰符集的键的答案。不幸的是,因为Keyboard.Modifiers
返回修饰符的当前状态(而不是按下键时修饰符的状态),这会导致快速打字员非常烦人的间歇性错误。
具体来说,假设有人按下 Ctrl+A,然后在按下 A 几毫秒后松开 Ctrl。现在假设系统负载很重;密钥处理程序开始执行但被抢占了 50 毫秒。当键处理程序再次执行时,Ctrl 的当前状态是“释放”。键处理程序现在会认为在没有 Ctrl 的情况下按下了“A”,这很糟糕。
同样,如果快速打字员输入 A,Ctrl+End 并且我的应用程序使用Keyboard.Modifiers
,它最终可能会观察到 Ctrl+A...
在 WinForms 中,该事件准确地KeyDown
告诉我 Ctrl 的状态,即使在处理事件时它已经被释放。如何在 WPF 中获得相同的行为?
编辑:Keyboard.Modifiers 可能实际上并未检索“当前”修饰键,而是检索与当前正在处理的按键消息相关的修饰键。在 WinAPI 中,这是“异步”和非异步键状态函数之间的区别。不幸的是,文档没有提到“当前”的确切含义。如果有人知道,请说出来。