Win32: 如何在按下 Alt+F4 时通过消息框确认退出?

问题描述 投票:0回答:2

首先,我不敢相信我是第一个在 SO.com 上永远问这个问题的人。更有可能的是:存在相同的问题,但使用不同的术语。如果是,请关闭此问题作为重复问题并链接到原始问题。

第二:我正在编写 C 并使用 Win32 API。我的目标是显示一个消息框以确认应用程序退出。

我知道退出 Win32 应用程序的三种不同的通用方法。 (如果还有更多请告诉我。)

  1. 按下主窗口右上角的
    X
    按钮,触发Win32事件
    WM_CLOSE
  2. 从系统菜单 (
    Alt+Space
    ) 中,选择触发 Win32 事件
    Close
    的菜单项
    WM_CLOSE
  3. 按快捷键
    Alt+F4

我能够正确处理#1 和#2。然而,我很难正确处理#3。

首先,我尝试了

CreateAcceleratorTableW()
#define IDM_ACCEL_ALT_F4 203
{.fVirt = (BYTE) (FALT | FVIRTKEY), .key = (WORD) VK_F4, .cmd = (WORD) IDM_ACCEL_ALT_F4}
。但是,此加速器永远不会触发
WM_COMMAND
。需要明确的是,使用相同的功能,我能够捕获其他快捷键,因此我确信我的设置是正确的。

其次,我监控了传入的 Win32 事件,但我从未看到:

WM_SYSKEYDOWN
WPARAM wParam[115/0x73] (VK_F4)
。奇怪的是,我确实看到:
WM_SYSKEYUP
加上
WPARAM wParam[115/0x73] (VK_F4)

请指教。

c winapi
2个回答
2
投票

根据文档:关闭窗口

用户可以通过单击“关闭”按钮来关闭应用程序窗口, 或使用键盘快捷键,例如 ALT+F4。 这些操作中的任何一个 使窗口接收 WM_CLOSE 消息。 WM_CLOSE消息 让您有机会在关闭窗口之前提示用户。 如果您确实想关闭窗口,请调用 DestroyWindow 功能。否则,只需从 WM_CLOSE 消息中返回零,并且 操作系统将忽略该消息并且不会销毁该消息 窗户。

默认情况下,按

ALT+F4
会使窗口接收 WM_CLOSE 消息。 ALT+F4 是关闭窗口的热键。无需创建加速器表。


0
投票
case WM_SYSCOMMAND:
{
    // sent when the user chooses a command from the Window menu (formerly known as the system or control menu), or when the user chooses the maximize/minimize/close buttons, or when an accelerator keystroke is translated to be a syscommand
    // in WM_SYSCOMMAND messages, the four low-order bits of the wParam parameter are used internally by the system
    switch( wParam & 0xFFF0 )
    {
    case SC_CLOSE:  // ALT-F4, or when X-ing out the window
        if ( MessageBoxW( m_hWnd, "Confirmation", "Are you sure you want to quit?", MB_OKCANCEL ) == IDOK )
        {
            PostQuitMessage( 0 );
        }
        break;
    }
    break;
}

如果我将消息写入到

WM_CLOSE
事件(在上述事件之后发送)上,则在收到用户输入之前我无法使消息框停止执行,所以这是下一个最好的事情。

© www.soinside.com 2019 - 2024. All rights reserved.