2010-01-27 3 views
1

я зацепил WM_SETFOCUS сообщения, вызвав APIПосле подключения подключаемой процедуры называется бесконечно

hhookCallWndProc = SetWindowsHookEx(WH_CALLWNDPROC, HookCallWndProc, hInst, threadID); 

Процедуру Крюка

extern "C" LRESULT _declspec(dllexport) __stdcall CALLBACK HookCallWndProc(int nCode, WPARAM wParam, LPARAM lParam) 
    { 
     if (nCode == HC_ACTION) { 
     CWPSTRUCT* info = (CWPSTRUCT*) lParam; 
     if(info->message == WM_SETFOCUS) 
     { 
      if(info->hwnd == hControl) 
      { 
       MessageBox(NULL,L"Focus on control",L"Focus",MB_OK); 
       } 
     } 
     } 
     return CallNextHookEx(hhookCallWndProc , nCode, wParam, lParam); 
    } 

Теперь, когда я сосредотачиваюсь на контроле, эта процедуру Крюка вызывалась. Отображается MessageBox. Но как только я нажимаю «ОК», появляется другое сообщение.

Сообщения продолжают появляться бесконечно. Я хочу получать сообщения только один раз, когда я сосредотачиваюсь на контроле, но здесь я получаю сообщения бесконечно.

Все, что я делаю неправильно.

+0

Да, похоже, окно сообщения вызывает проблему. Я удалил окно сообщения и напечатал заявление об отладке, и моя процедура крючка называлась 4,5 раза, пока клавиатура не была сфокусирована на контроле. – anand

ответ

4

Быстрое угадывание - не закрывает окно сообщения, чтобы перефокусировать управление и, следовательно, снова вызвать вашу функцию?

+0

+1 Я думаю, что это проблема. – gyurisc

2

Я думаю, проблема в том, что с полем сообщения вы убираете фокус, и при нажатии ok вы возвращаете фокус на элемент управления, поэтому ваш крючок снова вызывается. Я бы рекомендовал попробовать распечатать что-то, используя OutputDebugString вместо использования окна сообщения.

0

Всякий раз, когда отладка вашего приложения лучше создает файл журнала для сохранения информации. Вы отметили, что событие клавиатуры отслеживается более четырех раз.

  • В основном это зависит от того, где u r используется функция SetWindowsHookEx().
  • вы можете устранить эту проблему, правильно удалив функцию hook.