我有一个应用程序,我想在后台运行没有可见的窗口或控制台。 要做到这一点,我创build一个Windows应用程序,但我不创build一个窗口。 当请求closures时(即,当用户注销时),应用程序需要做一些清理。 我怎样才能确定什么时候结束? 我可以简单地创build一个处理WM_CLOSE消息的消息循环吗? 但是,我没有WndProc来处理WM_CLOSE消息。
要创建在后台运行的应用程序,请创建一个服务。 服务可以响应ServiceMain
调用。
如果您坚持开发前端应用程序,那么应用程序基本上没有合法的理由来尝试隐藏主窗口。 您的可执行映像可以是GUI( IMAGE_SUBSYSTEM_WINDOWS_GUI
)或控制台( IMAGE_SUBSYSTEM_WINDOWS_CUI
),并且不能混合使用,请参阅如何编写可作为控制台或GUI应用程序运行的程序 。 如果您选择一个GUI应用程序,那么您需要创建一个消息泵。 你可以选择创建一个隐藏的窗口作为你的“主”窗口。 您将在此隐藏窗口(这是您感兴趣的消息,而不是WM_CLOSE
)上获得WM_QUERYENDSESSION
和WM_ENDSESSION
。
另一方面,一个控制台应用程序将不得不处理信号,就像Andon已经向你展示的那样。
选择你的毒药。 我强烈建议去服务路线,因为“背景”应用程序的适当途径。
不要打扰创建一个虚拟窗口,有一个更简单的方法来处理无窗口应用程序中的关闭/退出控制事件。 要做到这一点,你可以使用一个小的已知Win API函数: SetConsoleCtrlHandler (...)
以下是如何使用控制处理程序的示例:
#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 (...)
应用程序中工作得非常好。
几个选项:
区别在于不可见的窗口接收到广播消息,而只有消息的窗口不会。