如何在 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框的安装状态(如点击取消返回)

如何在axios中捕获状态=取消?

如何在 Windows Phone 中更改 RadioButton 的按下状态

如何用Windows Server备份和恢复域控制器

win10键盘粘滞键如何取消