Низкоуровневый крюк мыши — зависание мыши в точке останова

Я хотел бы нарисовать и переместить мои окна самостоятельно (используя хромированную интегрированную структуру).
Для этого мне нужен глобальный обратный вызов при перемещении мыши за пределы моего окна — поэтому я установил низкоуровневый хук мыши:

hMouseLLHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)mouseHookProc, hInstance, NULL);

Простая ловушка захватывает события мыши и вызывает CallNextHookEx. Здесь нет проблем, все работает как положено.
Моя проблема сейчас: если отладчик ломается или выдается исключение, я больше не могу двигать мышью ..

Я попытался обработать хук в другом потоке, вот так:

HANDLE mouseProcHandle = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)mouseProcessor, NULL, NULL, &dwMouseProcThread);

DWORD WINAPI Win32Application::mouseProcessor(LPVOID lpParm) {
hMouseLLHook = SetWindowsHookEx(WH_MOUSE_LL, (HOOKPROC)mouseHookProc, ((Win32Application*)Application::getInstance())->hInstance, NULL);

MSG message;
while (GetMessage(&message, NULL, 0, 0)) {
TranslateMessage(&message);
DispatchMessage(&message);
}

UnhookWindowsHookEx(hMouseLLHook);
return 0;
}

Но это также не решает проблему. Есть ли обходной путь, решение или другой метод для этого?
Кроме того, я думаю, что ловушка низкого уровня может не потребоваться, так как мне нужно только знать о движении, и не будет проблемой, если я буду последним в очереди, поэтому системные / другие процессы могут обрабатывать мышиные обратные вызовы в первую очередь.

2

Решение

Как ваш отладчик остановит всю программу (все потоки в ней)
вероятно, нет никакого обходного пути, если использовать крючок.
Не так точно, но вы могли бы вместо этого опросить GetCursorPos в потоке.

3

Другие решения

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

Угадайте, что происходит, когда вы врываетесь в отладчик в своем событии ловушки? Больше никаких событий с мышью, пока вы не пройдете свою рутинную процедуру. Обычно вы можете сломать всю систему с таким центральным крюком. Но, к счастью, Windows предвидела плохие хуки. Вы заметите, что через некоторое время система снова реагирует на события мыши. Я думаю, что Windows просто удаляет ваш хук, когда он один раз зависает.

Теперь об отладке. Единственный способ безопасно взломать отладчик — никогда не трогать мышь после того, как вы попали в ловушку. Не очень практично. Единственный выход — отследить интересные вещи и посмотреть в файле журнала, что произошло внутри хука.
Если вы после примера кода, как перехватить события мыши и клавиатуры, вы можете посмотреть здесь:

http://etwcontroler.codeplex.com/SourceControl/latest#ETWControler/Hooking/Hooker.cs

5

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector