SetWindowsHookEx WH_MOUSE зависает на точке останова в Win7

привет,

в WinXP мое приложение успешно использует глобальный крюк мыши для получения положения мыши и щелчков, даже если оно не имеет фокуса. хук находится в отдельной .dll и инициализируется так (в delphi):

SetWindowsHookEx(WH_MOUSE, @MouseHookCB, HInstance , 0);

теперь на Win7 это в основном также работает во время выполнения, но я больше не могу хорошо отлаживать свое приложение (что я могу под XP). как только я попадаю в точку останова, Win7 полностью зависает. я не могу переключиться на другой процесс (даже диспетчер задач не открывается). если мне повезет, я смогу остановить свой процесс в IDE. хотя в большинстве случаев мне приходится перезагружаться/выходить из системы, чтобы восстановить доступ.

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

CallNextHookEx(MouseHook, Code, wParam, lParam);

т.е. просто наличие крючка вызывает проблемы.

когда globalhooks.dll записывает что-то в EventLog, я вижу, что он все еще активен, даже когда я нахожусь в точке останова.

Я пытался использовать хук lowlevelmouse через WH_MOUSE_LL, который в основном работает, но дает мне странные задержки при перемещении мыши при установке хука, а иногда и при изменении размера окна. также происходит зависание на несколько секунд при достижении точки останова, но, по крайней мере, система восстанавливается через ~ 5 секунд ... поэтому этот вариант еще хуже, поскольку он также влияет на время выполнения.

есть идеи, почему хук WH_MOUSE вообще зависает в моем приложении во время отладки?


person joreg    schedule 12.08.2010    source источник


Ответы (1)


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

Документация SetWindowsHookEx указывает на передачу 0 при подключении к собственному процессу и обработку в DLL при подключении к удаленному или глобальному процессу.

Также убедитесь, что MouseHookCB() возвращает значение CallNextHookEx.

person podostro    schedule 19.01.2011