2015-04-01 7 views
1

У меня есть код, который работает без каких-либо сообщений о проблемах в течение нескольких лет. Он устанавливает крючок клавиатуры низкого уровня, который пользователь использует для активации приложения.Почему SetWindowsHookEx() возвращает NULL, а LastError - ERROR_HOOK_NOT_INSTALLED

m_hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeybHookFn, GetModuleHandle(NULL), 0); 

Для одного пользователя внезапно (он работал на него раньше в течение многих лет), клавиатурный крючок не работает. После расследования я вижу, что SetWindowsHookEx() возвращает NULL, а GetLastError() возвращает 0x00000597, что составляет . ERROR_HOOK_NOT_INSTALLED.

Я не могу найти документацию о том, что это значит.

Каковы возможности, почему это может случиться? Настройки безопасности системы? Учетные записи пользователя? Пользователь использует Windows 7.

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

+1

Правильная проверка ошибок никогда не тестируется. Мой хрустальный шар говорит, что вы вызываете UnhookWindowHookEx(), когда этот код терпит неудачу. –

+0

Как только вы переместите эту строку кода в DLL, 'GetModuleHandle (NULL)' больше не возвращает дескриптор модуля в модуль, содержащий процедуру hook. Использование переменной псевдонима-линкера ['__ImageBase' (http://blogs.msdn.com/b/oldnewthing/archive/2004/10/25/247180.aspx) поможет устранить эту проблему. – IInspectable

+0

@HansPassant Я не уверен, что вы предлагаете. Вызовите UnhookWindowHookEx(), на каком дескрипторе? SetWindowsHookEx() возвращает NULL – Nicholas

ответ

1

Глядя на http://blogs.msdn.com/b/alejacma/archive/2010/10/14/global-hooks-getting-lost-on-windows-7.aspx, кажется, что это может произойти, если ЦП нагрузка высокая.

Другая мысль: произошло ли это при обновлении до 64-битных окон? Я не знаю, относится ли это к LL-крючкам, но вы не можете вставлять 32-разрядную DLL в 64-разрядный процесс.

Наконец: LL крючки не будет захватывать ввод в ОАКЕ-приподнятый процесс, если крюк не был установлен с ОАК-приподнятым процесса (более низкий процесс уровня привилегий не могут захватить ввод более высокого уровень привилегий одной)

+0

Что касается уровня процессора, сценарий отличается. В моем случае я даже не могу установить крючок. Что касается 64-битного, это решение было полностью протестировано на 64-битных окнах, и в любом случае использование DLL-инъекций не используется. Что касается процесса UAC с повышенным вниманием, можете ли вы уточнить? – Nicholas

+0

@HarryJohnston Я разъяснил сообщение, основанное на вашем комментарии, я имел в виду то, что вы сказали в своем последнем предложении. –

+0

Опять же, это не проблема, когда крючок не работает. Это проблема Windows, которая не позволяет установить крючок в первую очередь. – Nicholas

 Смежные вопросы

  • Нет связанных вопросов^_^