停止程序的简单有效方法

时间:2010-07-08 07:08:31

标签: c winapi

我有一个程序可以设置全局键盘挂钩并处理按键操作。这是我的WinMain:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow)
{
  MSG msg;
  logFile = fopen("C:\\keylog.txt", "w");
  hKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyEvent, GetModuleHandle(NULL), 0);

  GetMessage(&msg, NULL, 0, 0);

  UnhookWindowsHookEx(hKeyHook);
  fclose(logFile);
  return 0;
}

由于它不会创建任何窗口,因此它不会收到窗口消息,因此GetMessage会停止程序,并且CPU周期非常轻。但是,当它检测到某个键被按下时,我希望它退出程序。我无法广播消息,因为它不会收到消息。如果我这样做:

while(State == true)
  Sleep(500);

程序本身和全局钩子会停止,这是不可取的。使其休眠(0)会使其消耗无法管理的CPU周期。

那么,对我的问题最好的选择是什么?我唯一能想到的就是经历麻烦来注册我自己的窗口类并创建一个窗口来接收消息,但也许有更好的方法?

2 个答案:

答案 0 :(得分:4)

为什么不创建同步对象(可能是Event)并将GetMessage替换为WaitForSingleObject? 您可以轻松地使键盘钩子例程触发对象,您的应用程序将执行预终止操作。

答案 1 :(得分:3)

您无法使用HWND_BROADCAST广播消息。

您不需要窗口来接收消息。但是,如果您有某种方式发布您的广告ID,则可以使用PostThreadMessage()向您的应用发送消息(可能是WM_QUIT)。