关闭对话框时,Win32 应用程序将立即退出
Win32 application exits immediately when dialog box is closed
[编辑补充:原来答案很无聊,与Win32、对话框等无关。我只是在我的代码中有一个愚蠢的错误。感谢Hans Passant发现它。
(这有点长。执行摘要:我有一个简单的 Win32 应用程序,它在通知区域中创建一个图标,从不显示其主窗口,并且有一个"关于"框,可以通过右键单击通知区域图标来显示。我无法理解的原因,当显示"关于"框然后关闭时,应用程序的主消息循环会收到退出消息并退出。我可能做错了什么导致这种情况?
我正在编写一个小程序,它位于通知区域("系统托盘")中,并在后台执行各种不相关的处理。它的用户界面几乎是微不足道的:您可以右键单击通知区域图标以获取菜单,其中包含"退出"和"关于"选项;前者退出,后者弹出一些关于这个程序的模式对话框。
该应用程序是用C++编写的,直接使用 Win32(没有 MFC 或任何东西)。我很抱歉被困在石器时代。
唯一的问题是:当"关于"对话框关闭时,程序退出!可能是什么原因造成的?
我不确定哪些进一步的信息在解决这个问题时最有用。以下是一些观察结果。
- 单击对话框的"确定"按钮后,应用程序生命周期结束时的 Windows 消息序列如下所示。
- 对话框的进程WM_CTLCOLORBTN
- 应用程序的(不可见)主窗口变为WM_ENABLE(TRUE)。
- 对话框获取WM_CTLCOLORBTN、WM_IMESETCONTEXT、WM_SETFOCUS、WM_WINDOWPOSCHANGING、WM_WINDOWPOSCHANGED、3xWM_GETICON、WM_NCACTIVATE、2xWM_GETICON、WM_ACTIVATE WM_WINDOWPOSCHANGING。
- 应用程序的窗口 ges WM_WINDOWPOSCHANGING、WM_NCACTIVATE、消息0x93、0x93、0x91、0x92、0x92(这些是什么?)、WM_ACTIVATE。
- 对话框WM_KILLFOCUS,WM_IME_SETCONTEXT。
- 应用程序的窗口WM_IME_SETCONTEXT。
- 对话框WM_IME_NOTIFY;应用程序的主窗口也是如此。
- 应用程序的窗口WM_SETFOCUS。
- 对话框获取消息0x90、WM_DESTROY WM_NCDESTROY。
- 在这些消息之后,不会再向对话框窗口的进程或主应用程序窗口发送消息。
- 然后 GetMessage 在主消息循环中返回 0(消息WM_QUIT),一切都结束了。
- 在我的代码中,对 PostQuitMessage 的唯一调用是在主窗口的 WndProc 中,当主窗口WM_DESTROY时发生,在这种情况下实际上并没有调用它。
也许我的代码中有一些疯狂的东西,或者缺少一些东西。以下是一些摘录(为简洁起见,省略了一些可能不相关的细节)。
我的WinMain的粗略结构如下:
WNDCLASSEX wc;
// fill in fields of wc
RegisterClassEx(&wc);
HWND w = CreateWindow(...);
NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(nid));
// fill in fields of nid
Shell_NotifyIcon(NIM_ADD, &nid);
// (start a background thread to do the real work,
// which is of no interest here)
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
if (TranslateAccelerator(msg,hwnd, accel, &msg)) continue;
TranslateMesage(&msg);
DispatchMessage(&msg);
}
Shell_NotifyIcon(NUM_DELETE, &nid);
return (int)msg.wParam;
主窗口的 WndProc 如下所示:
switch (message) {
case WM_USER_SHELLICON: // my own, attached to the icon's menu
if (LOWORD(lParam) == WM_RBUTTONDOWN) // ... create menu and return TRUE
break;
case WM_COMMAND:
// menu item
switch (LOWORD(wParam)) {
case IDM_ABOUT:
DialogBox(the_instance, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, AboutProc);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default: return DefWindowProc(hWnd, message, wParam, lParam);
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default: return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
对话框的过程如下所示:
switch (message) {
case WM_INITDIALOG:
// fill in a version string
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam)==IDOK || LOWORD(wParam)==IDCANCEL) {
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
你的 WndProc() 函数中有一个错误。 WM_COMMAND案例缺少休息时间。 因此,当它执行时,比如说,IDM_ABOUT然后它就会陷入WM_DESTROY的情况。 再见。
我推荐 PC 棉绒。
相关文章:
- C++控制台应用程序阻止退出
- boost::asio::io_service 在线程中,不会在应用程序退出时退出
- 我在哪里编写在退出 C++ 窗口窗体应用程序之前执行的代码部分
- 正确退出 gtkmm 应用程序
- OpenGL 应用程序退出,退出代码为 -1073741515 (0xC0000135)
- 即使主窗口关闭,也不会退出应用程序
- 对 QMainWindow 使用 std::unique_ptr 时退出时出现 QT 应用程序分段错误
- 我如何使Ctrl Q退出一个没有Menubar的QT5应用程序
- C++11 监视器类,测试应用程序不想退出
- 仅在我退出应用程序后,使用Cout.write()函数在控制台上打印字符串
- 当我要退出应用程序时,如何在QT中自动调用destructor
- 在另一个线程正在运行的情况下退出应用程序时出错
- 在退出应用程序时安全退出Qt线程
- c++允许后台线程在退出应用程序之前完成
- QT/C++,OS X:退出应用程序时可选择隐藏(),以便应用程序继续运行,并在单击dock中的图标后再次显示
- 退出应用程序时崩溃
- 在某些设备上退出应用程序后仍保留进程
- 退出应用程序前关闭线程
- Win32 c++ openprocess应该返回null,如果用户已经退出应用程序,但没有
- 日志文件不可见,除非用户退出应用程序