SetWindowsHookEx для WH_JOURNALRECORD не работает в Vista / Windows 7

Я готовлю модуль Delphi, который устанавливает ловушку в потоке для записи макроса:

FHandleRec  := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);
FHandlePlay := SetWindowsHookEx(WH_JOURNALPLAYBACK, FPlayProc, HInstance, 0);

Это хорошо работает на WinXP, но на Vista / Windows 7 не удается сERROR_ACCESS_DENIED, Я нашел в гугле (это) ссылаясь (это). Цитата:

Процесс с более низким уровнем привилегий не может:… Использовать перехватчики журнала для мониторинга процесса с более высоким уровнем привилегий.

Пробовал без успеха:

Запустите приложение от имени администратора. Возможно, поток запускается с более низкими привилегиями, чем основной поток (хотя я не уверен на 100%)Олицетворение потока с контекстом безопасности администратора также не помогает.

Пример кода:

if LogonUser(PWideChar(sAdminUser), PWideChar(sDomain), PWideChar(sPwd),
             LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken) then 
begin  
  if not ImpersonateLoggedOnUser(hToken) then
    raise Exception.Create('Error impersonating the user');
end;
FHandleRec := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);

LogonUser а такжеImpersonateLoggedOnUser выполнить без ошибок.

Другие возможности попробовать:

Выключите UAC постоянно. Это помогает, но я не могу заставить пользователей модуля делать это.Клиент модуля подписывает заявку и помещает ее в надежное место. Не пробовал, но это радикально усложняет использование модуля для пользователей.Поместите модуль в какое-нибудь подписанное приложение и раздайте EXE. Это сломает некоторые основные функции.

Не могли бы вы показать код, который устанавливает ловушку под Visa / Windows 7 или предложить рабочее решение?

Ответы на вопрос(1)

Ваш ответ на вопрос