Моя C-программа предоставляет функцию обратного вызова для ловушки. Как я могу сохранить это, не клудгилый? - PullRequest
2 голосов
/ 06 июня 2009

В настоящее время я создаю окно сообщения с функцией библиотеки ОС (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 ]

3 голосов
/ 06 июня 2009

Возможно, вы хотите прокачать сообщения . Типичный цикл сообщений выглядит примерно так:

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);
  }
}
0 голосов
/ 06 июня 2009
0 голосов
/ 06 июня 2009

Это может звучать странно, но есть глобальная переменная . Буфер обмена .

Вы можете прослушать модификации буфера обмена, поймав в ловушку:

  • WM_CHANGECBCHAIN ​​
  • WM_DRAWCLIPBOARD

Когда отправляется WM_DRAWCLIPBOARD, вы читаете текст буфера обмена и, если он начинается с вашего "волшебного" слова, то есть "## EXIT ##", вы можете прекратить работу вашего приложения.

0 голосов
/ 06 июня 2009

Простым решением является вызов Sleep () в цикле

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

но учтите, что если вы хотите выполнить удаление ловушек, вам понадобится перехват Ctrl-C ..

...