Хук WH_KEYBOARD_LL не вызывается - PullRequest
       26

Хук WH_KEYBOARD_LL не вызывается

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

У меня есть некоторые проблемы с WH_KEYBOARD_LL ловушкой:

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

Функция ловушки находится в DLL, DLL загружается при запуске приложения, и ловушка устанавливается также при запуске из основного потока.Это работает отлично.Проблема возникает, когда мне нужно отключить хук и снова активировать его.Если я делаю это из основного потока приложения, оно работает нормально, но мне нужно сделать это из таймера, и здесь все идет не так.Я использую таймер, чтобы проверить, является ли мое приложение окном переднего плана (активным окном), если так, то ловушка активирована, а если нет, ловушка деактивирована.Возвращаемое значение SetWindowsHookEx при вызове из таймера всегда в порядке (не ноль), что в соответствии с MSDN означает, что ловушка была успешно установлена, но моя функция ловушки никогда не вызывается.

Вот как я устанавливаюмой хук:

SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHookProcedure,
                 GetModuleHandle(curModule.ModuleName), 0);

Кто-нибудь когда-либо испытывал это ??

Мое единственное предположение, что моя функция хука находится в dll, а обратный вызов таймера от другой dll, имеет ли это что-нибудьделать с моей проблемой ??

Ответы [ 3 ]

6 голосов
/ 19 февраля 2011

Обратный вызов ловушки выполняется в том же потоке, который вызвал SetWindowsHookEx (). Эта магия требует, чтобы этот поток накачал цикл сообщений. Что ж, ваш метод обратного вызова таймера вызывается из потока пула потоков. Он не качает, он даже не достаточно длинный, чтобы когда-либо быть в состоянии получить обратный вызов.

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

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

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

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

Для чего я стою, я использую GetModuleHandle(0) для SetWindowsHookEx в моем коде. Я понятия не имею, если это ваша проблема - мой код однопоточный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...