全局识别上次按下修饰键的时间

Posted

技术标签:

【中文标题】全局识别上次按下修饰键的时间【英文标题】:Globally identify last time modifier key was pressed 【发布时间】:2017-07-25 14:14:35 【问题描述】:

我有一个关于 Windows 的奇怪问题:有什么方法可以全局确定最后一次按下任何键,特别是修饰键(又名alt)而不求助于驱动程序或内核-模式代码?

一些背景:我已经注册了一个全局快捷键(alt+`),并在执行时成功运行代码。目前,我使用一些非常容易出错的启发式方法来确定用户是否在始终按住 alt 键的同时重复按下和释放反引号键,或者用户是否在上次调用热键处理程序后同时按下和释放这两个键.

我希望更准确地确定自上次调用我的处理程序以来是否已释放 alt 键。能够唯一识别最后一次 alt 按键的时间是一个明显的解决方案。另一个是以某种方式连接到每个 alt 按键以记录该信息,我认为这是不可能的。

我愿意接受所有想法和建议!

【问题讨论】:

几乎可以肯定,当按下某个键时,Windows 不会在内部保存时间。您可以致电SetWindowsHookEx(WH_KEYBOARD_LL,) 并在内部监控按键和时间 低级键盘钩子全局钩子。它甚至在系统确定输入应该转到哪个窗口之前就挂钩输入事件。 @RbMm 如果您发布它,我很乐意接受它作为答案,因为您在 IInspectable 之前提到了这一点。 【参考方案1】:

您可以安装全局低级键盘挂钩(通过调用SetWindowsHookEx,传递LowLevelKeyboardProc)。这允许您全局监视VK_MENUVK_LMENU 和/或VK_RMENU 键的WM_KEYUP 事件。结合热键处理程序中记录的时间戳,您可以确定热键是同一 Alt 序列的一部分还是新序列的一部分:如果WM_KEYUP 事件的时间戳大于先前的热键输入, 用户开始一个新的 Alt+` 序列,否则它是相同序列的延续。

【讨论】:

恐怕你误解了我的问题。我已经在使用 RegisterHotKey 并且运行良好。我正在尝试获取此 API 提供的功能之外的其他信息。 @MahmoudAl-Qudsi:确实,我做到了。即使有你的澄清,我也无法理解。如果您设置了全局热键,它会在按下时调用您的处理程序。您可以将上次按下它的时间存储在您的处理程序中。你为什么不呢? 我当然是在存储时间。我为 alt+` 设置了热键,但是(显然)以相同的方式调用热键回调,无论用户是否按下并释放 alt 和反引号,或者用户是否按住 alt 并重复按下并释放反引号。我需要区分两者以提供不同的结果。最好的例子是 alt-tab,如果你 alt-tab, alt-tab 的行为与 alt-tab, tab 不同。

以上是关于全局识别上次按下修饰键的时间的主要内容,如果未能解决你的问题,请参考以下文章

检测修饰键按下?

Laravel - 如何将外键用于具有识别外键的表?

为啥在鼠标移动操作期间修饰键的状态没有按预期改变?

屏幕关闭时识别音量按钮按下 Android

VBA F9 按钮已识别 鼠标左键未识别

使用 GetAsyncKeyState() 识别按下的热键仅在 [重复]