检测修饰键按下?

Posted

技术标签:

【中文标题】检测修饰键按下?【英文标题】:Detecting modifier key down? 【发布时间】:2012-06-06 21:35:29 【问题描述】:

我有一个 WPF 应用程序需要在第一次按下修饰键(例如 Alt 或 Control)时做出响应。无论是否同时按下其他键,都需要响应,所以我基本上需要能够知道这些键中的任何一个按下的瞬间。

我看到的修饰键的事件行为与其他键不同 --- 看起来 KeyDown 事件和 PreviewKeyDown 事件实际上是在按下按钮后弹出时触发,这没有帮助。

在深入研究事件触发问题时,我创建了一个定时后台循环来轮询所有当前键状态。即使这样也不起作用 --- 如果我按下修饰键,并且我没有释放该键或按下任何其他键,则此民意调查错误地表示修饰键实际上并未按下(无限期地,直到另一个键按下)

我觉得我一定错过了一些基本的东西,但到目前为止还没有运气。有什么想法吗?

【问题讨论】:

检查 Ray Burns 在该线程***.com/questions/3099472/…的解释 【参考方案1】:

您是否附加到主窗口实例上的“Keyboard.KeyDown”事件?

<Window x:Class="WpfApplication3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Keyboard.KeyDown="Window_KeyDown">

</Window>

【讨论】:

是的,我已经尝试附加 KeyDown 和 PreviewKeyDown 处理程序。他们在开火,只是不是在我需要他们的时候。事件发生在:a)当修改键在被按下后恢复时,或 b)当键盘上的另一个键被按下时。只是按下修饰符似乎没有任何作用。 我在您的原始帖子中注意到您正在使用计时器来测试这一点,您应该知道 WPF 计时器是线程安全的,这意味着它在 UI 完成执行之前不会触发。尝试在您的 keydown 处理程序中放置一个 MessageBox 并查看它何时触发。【参考方案2】:

事实证明,这种行为特定于我的环境(在 Parallels 6.0 VM 中运行 Windows 和 Visual Studio)。 Parallels 必须拦截这些事件以保留一些低级 Mac OS 功能。我不确定其他 VM 设置,但这在本机 Windows 环境中看起来不是问题。

【讨论】:

以上是关于检测修饰键按下?的主要内容,如果未能解决你的问题,请参考以下文章

检测 JavaScript 中的箭头键按下

检测蓝牙键盘上的 Tab 键按下

检测 Siri Remote 上的音量和 Home 键按下情况

检测 UIKit for Mac (Catalyst) 中的单个修饰符键更改

C语言 如何在一段时间内检测键盘是不是按下

检测是不是在 KeyRoutedEventArgs 事件中按下了修饰键