是否可以通过 Windows 键捕获 Windows 开始菜单弹出窗口(可能没有钩子)?

Posted

技术标签:

【中文标题】是否可以通过 Windows 键捕获 Windows 开始菜单弹出窗口(可能没有钩子)?【英文标题】:Is it possible to trap the Windows Start Menu popup via Windows key(possibly without a hook)? 【发布时间】:2011-08-19 15:34:53 【问题描述】:

我一直在研究输入事件系统。 我映射了我自己键盘上的所有键、扫描码等,包括两个 Windows 键。 当我按下它们时,程序成功地为它们接收到不同的 keydown 事件,没有任何麻烦。 但是,当我松开按键时,会弹出“开始”菜单,在 Windows 模式下隐藏程序,甚至在全屏模式下将其最小化。

所以我的问题在于抑制它。

Arma 2,一款军事模拟器/游戏,允许将命令映射到这些按键上而不会遇到任何麻烦。

我必须在哪里捕捉该事件? 只要它有焦点,我可以为我自己的窗口做吗? 只要它正在运行,我会被禁用的win键卡住吗? 还是别的什么?

谷歌搜索它主要是没有结果的,因为 Windows 键也指的是产品键,当我找到一些东西时,它通常会完全禁用整个按钮。 我只是想抑制弹出窗口。

编辑: 我试过了

case WM_SYSCOMMAND:
        switch(wParam)
        

        case SC_TASKLIST:
            return 0;

        default:
            break;
        

但这给了我非常奇怪的结果。 如果我只用winkeys发送垃圾邮件,它似乎工作,只要我移动鼠标,它没有,开始菜单会再次弹出。

编辑: 我也尝试过钩子,但是在win7上,如果回调花费太多时间,它们就会被删除,这可能在加载大数据时发生,所以他们建议为它使用一个专用线程,但我认为这对于一个需要处理的键来说是矫枉过正的。

我只想知道开始菜单的调用位置。我自己的程序?系统? 这太烦人了,我正在考虑尝试联系 Bohemia Interactive 的人并询问他们是如何做到的。

就这一个键,哎呀微软……即使使用“超级键/超级键”搜索词,我通常也只能找到完全禁用的方法,从注册表更改到第三方后台程序。

呸!

【问题讨论】:

windows 键的另一个名称是超级键。它可能会在 google 中为您提供不同的结果 我会讨厌你的游戏。我将如何回到我的桌面? @David: control-alt-delete 仍然可以工作——我希望如此。 :-) @David:系统热键不受此影响,alt-tab 等仍然有效。如果不是这样,我自己会发疯的。 【参考方案1】:

This artcile was relating to C# but may point you in the right direction;

来自MSDN:

全局挂钩监视同一桌面中所有线程的消息 调用线程。特定于线程的钩子仅监视消息 一个单独的线程。全局钩子过程可以在 与调用线程在同一桌面的任何应用程序的上下文, 所以程序必须在一个单独的 DLL 模块中。线程特定的 挂钩过程仅在关联线程的上下文中调用。

This was the most helpful link in order to answer the question in the above article

【讨论】:

【参考方案2】:

原始输入 API 应该可以解决您的问题。

http://msdn.microsoft.com/en-us/library/ms645543.aspx

【讨论】:

有趣的是,我确实使用了 RawInput,但你的帖子让我再次检查了文档。您是否有机会参考注册设备时可以使用的“RIDEV_NOHOTKEYS”标志?因为这似乎可以解决它,只是想在这里确定 如果你提到你已经在使用 RawInput 会更好 - 但在这种情况下,我想它是最好的。我并没有特别了解 RIDEV_NOHOTKEYS,但听起来确实好像您已经解决了问题。

以上是关于是否可以通过 Windows 键捕获 Windows 开始菜单弹出窗口(可能没有钩子)?的主要内容,如果未能解决你的问题,请参考以下文章

桌面粉笔功能.有window ink功能区开启的快捷键

windows10系统window键失灵,没有反应

window普罗米修斯监控如何重启

《解读window核心编程》 之 注冊表

捕获window.onbeforeunload确认对话框的结果

是否可以从 Java 程序中捕获 Windows 弹出消息框?