Windows应用程序中没有窗口的窗口消息

时间:2013-09-18 05:16:09

标签: c++ windows winapi

我有一个应用程序,我想在后台运行,没有可见的窗口或控制台。为此,我创建了一个Windows应用程序,但我没有创建窗口。当请求关闭时(即当用户注销时),应用程序需要进行一些清理。如何确定何时关闭?我可以简单地创建一个处理WM_CLOSE消息的消息循环吗?但是我没有WndProc来处理WM_CLOSE消息。

3 个答案:

答案 0 :(得分:5)

不要打扰创建虚拟窗口,有一种更简单的方法来处理无窗口应用程序中的关闭/退出控制事件。为此,您使用一个名为Win SetConsoleCtrlHandler (...)

的Win API函数

以下是如何使用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)

有两种选择:

  1. 创建一个窗口,但不要设置WS_VISIBLE标志。
  2. 创建message-only window
  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_QUERYENDSESSIONWM_ENDSESSION(这些是您感兴趣的邮件,而不是WM_CLOSE)。

另一方面,控制台应用程序必须处理信号,就像Andon已经向您展示的那样。

选择你的毒药。我强烈建议采用服务路线,这是“背景”应用的适当途径。