如何在 Windows 中取消“系统键关闭”状态
Posted
技术标签:
【中文标题】如何在 Windows 中取消“系统键关闭”状态【英文标题】:How to cancel the 'system key down' state in Windows 【发布时间】:2008-12-09 09:56:16 【问题描述】:在 Windows 中,当您按下 Alt 并再次释放时,菜单栏将被激活。但是,当您按下 Alt,然后单击,然后释放时,菜单栏不会被激活,因为大概您想 Alt+单击,而不是激活菜单栏。
我想支持 Alt+鼠标滚轮更改(映射到水平滚动)。这很好用,但如果您准备好并松开 Alt 键,菜单栏就会激活。显然这是不可取的。当您 Alt+单击取消内部 'ActivateMenuBarWhenAltIsReleased' 标志时,Windows 必须在内部执行某种操作。如果我知道它是什么,我可以在收到鼠标滚轮消息时自己执行此操作。
那么,有谁知道当您按下并释放 Alt 时激活菜单栏的系统是如何工作的,以及如何取消它?谢谢!
【问题讨论】:
【参考方案1】:当您松开 Alt 键时,系统会生成 WM_SYSCOMMAND
/SC_KEYMENU
消息。此外,除非您按某个键打开特定的弹出菜单,否则 lparam 将为 0。 DefWindowProc 收到此信息后,将进入菜单循环。因此,您所要做的就是检测此消息并阻止它进入 DefWindowProc:
LRESULT CALLBACK MainWndProc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lparam)
switch (msg)
// ...
case WM_SYSCOMMAND:
DWORD cmd = wparam & 0xfff0;
// test for Alt release without any letter key pressed
if (cmd == SC_KEYMENU && lparam == 0)
// don't let it reach DefWindowProc
return 0;
break;
// ...
return DefWindowProc(wnd, msg, wparam, lparam);
【讨论】:
这可能适用于应用程序,但我正在编写一个插件,因此我无法控制主消息循环...以上是关于如何在 Windows 中取消“系统键关闭”状态的主要内容,如果未能解决你的问题,请参考以下文章
如果用户取消 InApp 购买或只是另一个失败状态,如何处理
Android 获取android安装apk框的安装状态(如点击取消返回)