在服务下设置Key Hook

时间:2012-01-27 16:25:58

标签: delphi key hook

您好我有以下代码:

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 个答案:

答案 0 :(得分:1)

在Vista及以上,服务在隔离会话中运行,会话0.键盘与交互用户的桌面相关联,该桌面位于不同的会话中。因此,您的服务只是与键盘隔离。您需要在交互式用户的桌面上运行您的进程。

如果您在XP上运行,“允许服务与桌面交互”选项可能允许您的挂钩在服务上下文中生效。不过,不推荐这种方法。