После зацепки процедура hook вызывается бесконечно - PullRequest
1 голос
/ 27 января 2010

Я перехватил сообщение 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 отображается. Но как только я нажимаю кнопку ОК, появляется другое сообщение.

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

Все, что я делаю не так.

Ответы [ 3 ]

4 голосов
/ 27 января 2010

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

2 голосов
/ 27 января 2010

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

0 голосов
/ 15 февраля 2011

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

  • Это в основном зависит от того, где вы используете функцию SetWindowsHookEx ().
  • Вы можете устранить эту проблему, правильно удалив функцию подключения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...