[英]Window messages in windows application with no window
我有一個應用程序,我想在后台運行,沒有可見的窗口或控制台。 為此,我創建了一個Windows應用程序,但我沒有創建窗口。 當請求關閉時(即用戶注銷時),應用程序需要進行一些清理。 如何確定何時關閉? 我可以簡單地創建一個處理WM_CLOSE消息的消息循環嗎? 但是我沒有WndProc來處理WM_CLOSE消息。
不用擔心創建虛擬窗口,有一種更簡單的方法來處理無窗口應用程序中的關閉/退出控制事件。 要做到這一點,你使用一個鮮為人知的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 (...)
應用程序中也能正常工作。
要創建在后台運行的應用程序,請創建服務。 服務可以響應ServiceMain
調用。
如果你堅持創建一個前端應用程序,那么應用程序試圖隱藏其主窗口基本上沒有合理的理由。 您的可執行映像可以是GUI( IMAGE_SUBSYSTEM_WINDOWS_GUI
)或控制台( IMAGE_SUBSYSTEM_WINDOWS_CUI
),也不能混用它們,請參閱如何編寫可以作為控制台或GUI應用程序運行的程序 。 如果選擇GUI應用程序,則需要創建消息泵。 您可以選擇創建一個隱藏窗口作為“主”窗口。 您將在此隱藏窗口中獲取WM_QUERYENDSESSION
和WM_ENDSESSION
(這些是您感興趣的消息,而不是WM_CLOSE
)。
另一方面,控制台應用程序必須處理信號,就像Andon已經向您展示的那樣。
選擇你的毒葯。 我強烈建議去服務路線,這是“背景”應用程序的正確途徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.