【问题标题】:How to capture windows shut down/ Restart message using C++如何使用 C++ 捕获 Windows 关闭/重新启动消息
【发布时间】:2012-06-25 17:01:21
【问题描述】:

如果用户关闭/重新启动/注销计算机,我想以编程方式检查我的应用程序。 我试图实现下面的代码,它给出了编译错误

error: invalid conversion from 'bool (*)(DWORD)' to 'BOOL (*)(DWORD)'
error: initializing argument 1 of 'BOOL SetConsoleCtrlHandler(BOOL (*)(DWORD), BOOL)'

void TestApp:: OnQuit()
{
    SetConsoleCtrlHandler(HandlerRoutine, TRUE);
}

//Windows Call Back function implementation
bool WINAPI HandlerRoutine(DWORD dwCtrlType)
{
   bool ret = false;    
   if (dwCtrlType == CTRL_LOGOFF_EVENT || dwCtrlType == CTRL_SHUTDOWN_EVENT)
      //Graceful Quit

   return ret;
}

我的开发环境是 QT Creator QT SDK 和 C++。

【问题讨论】:

  • BOOL 不是 bool
  • 这里是proof for BOOLtypedefint。这就是为什么使用 bool 不起作用的原因。
  • @chris, Kuba Ober -- 感谢您的帮助。

标签: c++ qt winapi


【解决方案1】:

正如其他人所说,BOOLint,而不是boolbool 的标称值为 truefalse10BOOL 使用 FALSE == 0TRUE == !FALSE。大多数情况下都没有关系,因为它们基本上以相同的方式工作。

BOOL 来自 WinAPI 的旧传统,当时 C 没有内置的 bool 类型。

所以,您真正需要做的就是在您的处理程序中将 bool 更改为 BOOL

BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
^^^^
{
   BOOL ret = false;    
   ^^^^
   if (dwCtrlType == CTRL_LOGOFF_EVENT || dwCtrlType == CTRL_SHUTDOWN_EVENT)
      //Graceful Quit

   return ret;
}

【讨论】:

  • @Wes,代码编译得很好,但永远不会进入方法 HandlerRoutine。我想知道回调实现有什么问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多