您好我有以下代码:
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;
当我把它作为一个过程启动时,这个好东西很好用。
但是,当我尝试将其投入使用时,它不起作用。
不起作用=不检测击键。
我做错了什么?
谢谢!
答案 0 :(得分:1)
在Vista及以上,服务在隔离会话中运行,会话0.键盘与交互用户的桌面相关联,该桌面位于不同的会话中。因此,您的服务只是与键盘隔离。您需要在交互式用户的桌面上运行您的进程。
如果您在XP上运行,“允许服务与桌面交互”选项可能允许您的挂钩在服务上下文中生效。不过,不推荐这种方法。