我有一个应用程序,我想在后台运行,没有可见的窗口或控制台。为此,我创建了一个Windows应用程序,但我没有创建窗口。当请求关闭时(即当用户注销时),应用程序需要进行一些清理。如何确定何时关闭?我可以简单地创建一个处理WM_CLOSE消息的消息循环吗?但是我没有WndProc来处理WM_CLOSE消息。
答案 0 :(得分:5)
不要打扰创建虚拟窗口,有一种更简单的方法来处理无窗口应用程序中的关闭/退出控制事件。为此,您使用一个名为Win SetConsoleCtrlHandler (...)
以下是如何使用Control Handler:
的示例#include <windows.h>
// You can fill-in your own behavior, this is just an example handler that
// covers most of the most common events.
BOOL
ControlHandler (DWORD dwControlEvent)
{
switch (dwControlEvent)
{
// User wants to shutdown
case CTRL_SHUTDOWN_EVENT:
return FALSE;
// User wants to logoff
case CTRL_LOGOFF_EVENT:
return FALSE;
// Ctrl + C
case CTRL_C_EVENT:
return TRUE;
// User wants to exit the "normal" way
case CTRL_CLOSE_EVENT:
return TRUE;
// Everything else, just ignore it...
default:
return FALSE;
}
}
int
main (void)
{
// Set the control handler so the app will be notified upon any special
// termination event.
SetConsoleCtrlHandler ((PHANDLER_ROUTINE) ControlHandler, TRUE);
//
// Main Loop Here ...
//
return 0;
}
几年前我必须了解这一点,因为当我的控制台应用程序以 Ctrl + C 终止时,某些中间件无法正常清理其资源。当我查看堆栈跟踪时,我偶然发现了它。值得一提的是,这取代了 Ctrl + C 等事件的标准信号处理程序。
顺便说一下,即使它被称为“控制台控制处理程序”,它在使用WinMain (...)
而不是main (...)
的应用程序中也能正常工作。
答案 1 :(得分:3)
有两种选择:
不同之处在于隐形窗口接收广播消息,而仅消息窗口则不接收。
答案 2 :(得分:2)
要创建在后台运行的应用程序,请创建服务。服务可以响应ServiceMain
来电。
如果你坚持创建一个前端应用程序,那么应用程序试图隐藏其主窗口基本上没有合理的理由。您的可执行映像可以是GUI(IMAGE_SUBSYSTEM_WINDOWS_GUI
)或控制台(IMAGE_SUBSYSTEM_WINDOWS_CUI
),也不能混合它们,请参阅How do I write a program that can be run either as a console or a GUI application。如果选择GUI应用程序,则需要创建消息泵。您可以选择创建隐藏窗口作为“主要”窗口。您将在此隐藏窗口中显示WM_QUERYENDSESSION
和WM_ENDSESSION
(这些是您感兴趣的邮件,而不是WM_CLOSE
)。
另一方面,控制台应用程序必须处理信号,就像Andon已经向您展示的那样。
选择你的毒药。我强烈建议采用服务路线,这是“背景”应用的适当途径。