Установка KeyHook под Сервисом - PullRequest
1 голос
/ 27 января 2012

Здравствуйте, у меня следующий код:

var
  KeyHook: HHOOK;

function KeyHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
type
  PKBDLLHOOKSTRUCT = ^TKBDLLHOOKSTRUCT;
  TKBDLLHOOKSTRUCT = packed record
    vkCode: DWORD;
    scanCode: DWORD;
    flags: DWORD;
    time: DWORD;
    dwExtraInfo: DWORD;
  end;
const
  LLKHF_ALTDOWN = $20;
var
  pkbhs: PKBDLLHOOKSTRUCT;
begin
  pkbhs := PKBDLLHOOKSTRUCT(lParam);
  if nCode = HC_ACTION then
  begin
    if (pkbhs^.vkCode = VK_ESCAPE) and WordBool(GetAsyncKeyState(VK_CONTROL) and $8000) then
    begin
      Result := 1;
      Exit;
    end;
  end;
  Result := CallNextHookEx(KeyHook, nCode, wParam, lParam);
end;

initialization
  KeyHook := SetWindowsHookEx(WH_KEYBOARD_LL, @KeyHookProc, 0{HInstance}, 0);
  if KeyHook = 0 then
    RaiseLastOSError;

и это хорошо работает, когда я запускаю его как процесс.

Но когда я пытаюсь заставить его работать в режиме обслуживания, он не работает.

Не работает = Не обнаруживает нажатия клавиш.

Что я делаю не так?

Спасибо!

1 Ответ

1 голос
/ 29 января 2012

В Vista и более поздних версиях службы запускаются в изолированном сеансе, сеанс 0. Клавиатура связана с рабочим столом интерактивного пользователя, который находится в другом сеансе.Таким образом, ваш сервис просто изолирован от клавиатуры.Вам нужно, чтобы ваш процесс запускался на рабочем столе интерактивного пользователя.

Если вы работаете в XP, опция «Разрешить службе взаимодействовать с рабочим столом» может позволить вашему хуку вступить в силу в контексте службы.Тем не менее, такой подход не рекомендуется.

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