SetWindowsHookEx WH_MOUSE зависает на точке останова в Win7 - PullRequest
3 голосов
/ 12 августа 2010

helos,

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

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

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

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

CallNextHookEx(MouseHook, Code, wParam, lParam);

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

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

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

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

1 Ответ

1 голос
/ 19 января 2011

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

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

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

...