Простой и эффективный способ остановить программу - PullRequest
0 голосов
/ 08 июля 2010

У меня есть программа, которая устанавливает глобальную клавиатуру и обрабатывает нажатия клавиш.Это мой 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 остановит программу, и это очень мало на циклах ЦП.Однако, когда он обнаруживает нажатие определенной клавиши, я хочу, чтобы он вышел из программы.Я не могу передать сообщение, потому что оно не получит его.Если я сделаю что-то вроде:

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

Сама программа и глобальный хук остановятся, и это нежелательно.Отключение (0) приводит к тому, что он потребляет неуправляемое количество циклов ЦП.

Итак, что является лучшей альтернативой для моей проблемы?Единственное, о чем я могу думать, - это пройти через регистрацию моего собственного класса окна и создать окно для получения сообщения, но, возможно, есть лучший способ?

Ответы [ 2 ]

4 голосов
/ 08 июля 2010

Почему бы не создать объект синхронизации (возможно, Event) и заменить GetMessage на WaitForSingleObject? Вы можете легко сделать так, чтобы ваша процедура перехвата клавиатуры вызывала объект, и ваше приложение будет выполнять предварительные действия.

3 голосов
/ 08 июля 2010

Вы не можете передать сообщение, используя HWND_BROADCAST.

Вам не нужно окно для получения сообщений.Однако, если у вас был какой-то способ опубликовать свой идентификатор потока, тогда PostThreadMessage () можно использовать для отправки сообщения (вероятно, WM_QUIT) в ваше приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...