是否可以通过 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 开始菜单弹出窗口(可能没有钩子)?的主要内容,如果未能解决你的问题,请参考以下文章