2

目前,我正在生成一个带有操作系统库函数 (Windows.h) 的消息框,它神奇地使我的程序保持活动状态并响应对回调函数的调用。

可以使用什么替代方法让程序永远运行下去?

捕获 'Ctrl-c' 或 SIGINT 并随后调用 RemoveHook() 以进行干净退出会很好,但不是必需的。

HOOK my_hook;

CALLBACK my_callback_fn()
{
  ...
}

int main()
{
  my_hook = SetHook(my_callback_fn);
  MessageBox("Press OK to stop."); // This is bad.
  RemoveHook(my_hook);
  return 0;
}
4

4 回答 4

3

您可能想要发送消息。典型的消息循环如下所示:

BOOl ret;
MSG msg;
while ((ret=::GetMessage(&msg, hWnd, 0, 0))!=0)
{
  ::TranslateMessage(&msg);
  ::DispatchMessage(&msg);
}

你似乎没有一个实际的窗口可以打开,你也没有说出SetHook实际在做什么——也许这可以为你提供一个?

另一种方法是使用MsgWait 函数。也许您有某种句柄正在等待发出信号以便退出?:

while (::MsgWaitForMultipleObjects(1, &handle, FALSE, INFINITE, QS_ALLEVENTS)==WAIT_OBJECT_0+1+
{
  BOOl ret;
  MSG msg;
  while ((ret=::PeekMessage(&msg, hWnd, 0, 0, TRUE))!=0)
  {
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
  }
}
于 2009-06-06T08:44:02.750 回答
0

一个简单的解决方案是在循环中调用 Sleep()

int main() {
   // your stuff
   while(1) {
      Sleep( 10000 );
   }
   return 0;
}

但请注意,如果你想做删除钩子的东西,你需要做 Ctrl-C 陷阱..

于 2009-06-06T08:39:20.077 回答
0

使用命令行创建 Windows 服务可能是一种方法

您也可以通过编程方式创建它

于 2009-06-06T08:40:01.887 回答
0

这可能听起来很奇怪,但是有一个全局变量剪贴板。_

您可以通过捕获以下内容来收听剪贴板修改:

  • WM_CHANGECBCHAIN
  • WM_DRAWCLIPBOARD

当 WM_DRAWCLIPBOARD 被发送时,您阅读剪贴板文本,如果它以您的“魔术”字开头,即“##EXIT##”,您可以终止您的应用程序。

于 2009-06-06T08:43:25.577 回答