簡體   English   中英

Windows應用程序中沒有窗口的窗口消息

[英]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 (...)應用程序中也能正常工作。

有兩種選擇:

  1. 創建一個窗口,但不要設置WS_VISIBLE標志。
  2. 創建僅消息窗口

不同之處在於隱形窗口接收廣播消息,而僅消息窗口則不接收廣播消息。

要創建在后台運行的應用程序,請創建服務。 服務可以響應ServiceMain調用。

如果你堅持創建一個前端應用程序,那么應用程序試圖隱藏其主窗口基本上沒有合理的理由。 您的可執行映像可以是GUI( IMAGE_SUBSYSTEM_WINDOWS_GUI )或控制台( IMAGE_SUBSYSTEM_WINDOWS_CUI ),也不能混用它們,請參閱如何編寫可以作為控制台或GUI應用程序運行的程序 如果選擇GUI應用程序,則需要創建消息泵。 可以選擇創建一個隱藏窗口作為“主”窗口。 您將在此隱藏窗口中獲取WM_QUERYENDSESSIONWM_ENDSESSION (這些是您感興趣的消息,而不是WM_CLOSE )。

另一方面,控制台應用程序必須處理信號,就像Andon已經向您展示的那樣。

選擇你的毒葯。 我強烈建議去服務路線,這是“背景”應用程序的正確途徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM