我有一个应用程序,希望在后台运行且没有可见的窗口或控制台。为了实现这一点,我创建了一个windows应用程序但没有创建窗口。当请求关闭应用程序时(例如用户注销时),它需要清理一些东西。那么如何确定何时关闭呢?我可以简单地创建一个消息循环来处理WM_CLOSE消息吗?但是我没有WndProc来处理WM_CLOSE消息。
我有一个应用程序,希望在后台运行且没有可见的窗口或控制台。为了实现这一点,我创建了一个windows应用程序但没有创建窗口。当请求关闭应用程序时(例如用户注销时),它需要清理一些东西。那么如何确定何时关闭呢?我可以简单地创建一个消息循环来处理WM_CLOSE消息吗?但是我没有WndProc来处理WM_CLOSE消息。
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 (...)
的应用程序中也可以完美地运行。
ServiceMain
调用。IMAGE_SUBSYSTEM_WINDOWS_GUI
)或控制台(IMAGE_SUBSYSTEM_WINDOWS_CUI
),您不能混合使用它们,请参见如何编写既可以作为控制台应用程序又可以作为GUI应用程序运行的程序。如果您选择GUI应用程序,则需要创建消息泵。您可以选择将隐藏窗口作为“主”窗口。您将在此隐藏窗口上收到WM_QUERYENDSESSION
和WM_ENDSESSION
(这些是您感兴趣的消息,而不是WM_CLOSE
)。