首先,我不敢相信我是第一个在 SO.com 上永远问这个问题的人。更有可能的是:存在相同的问题,但使用不同的术语。如果是,请关闭此问题作为重复问题并链接到原始问题。
第二:我正在编写 C 并使用 Win32 API。我的目标是显示一个消息框以确认应用程序退出。
我知道退出 Win32 应用程序的三种不同的通用方法。 (如果还有更多请告诉我。)
X
按钮,触发Win32事件WM_CLOSE
。Alt+Space
) 中,选择触发 Win32 事件 Close
的菜单项 WM_CLOSE
。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)
请指教。
根据文档:关闭窗口
用户可以通过单击“关闭”按钮来关闭应用程序窗口, 或使用键盘快捷键,例如 ALT+F4。 这些操作中的任何一个 使窗口接收 WM_CLOSE 消息。 WM_CLOSE消息 让您有机会在关闭窗口之前提示用户。 如果您确实想关闭窗口,请调用 DestroyWindow 功能。否则,只需从 WM_CLOSE 消息中返回零,并且 操作系统将忽略该消息并且不会销毁该消息 窗户。
默认情况下,按
ALT+F4
会使窗口接收 WM_CLOSE 消息。 ALT+F4 是关闭窗口的热键。无需创建加速器表。
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
事件(在上述事件之后发送)上,则在收到用户输入之前我无法使消息框停止执行,所以这是下一个最好的事情。