【问题标题】:Seting KeyHook under Service在 Service 下设置 Key Hook
【发布时间】:2012-01-27 16:25:57
【问题描述】:

您好,我有以下代码:

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;

当我将它作为流程启动时,这种好方法效果很好。

但是当我尝试让它在服务下工作时它不起作用。

不起作用 = 不检测击键。

我做错了什么?

谢谢!

【问题讨论】:

  • 您应该编辑您的问题以删除不应该存在的部分。如果您使用发布问题的同一帐户登录,则可以这样做;只需单击问题下方的edit 链接。您还应该解释“它不起作用”的含义,因为如果没有更多信息,我们将无法提供帮助。 “它不起作用”可以表示从“它引发异常”到“没有任何反应”到“我的电脑爆炸”。更具体可以提高您获得答案的机会。 :)
  • 看来你正在尝试一些不可能的事情:stackoverflow.com/questions/5815424/…

标签: delphi key hook


【解决方案1】:

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

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

【讨论】:

  • Win 9 或 Win 10 的方法是什么。你有任何通用方法的链接吗?试图通过 Windows 服务来获取密钥 - 阅读了几天但仍然卡住了;)
  • @seb 你不会在服务中获取密钥
  • 我必须 ;) 到星期天 ;)
  • @Seb 你不会去的。没有必要告诉自己必须做一些不可能的事情。
  • @Seb 是的,在用户会话中处理,ipc 到你的服务
猜你喜欢
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 2020-01-08
  • 2016-12-08
  • 2015-05-16
相关资源
最近更新 更多