2

我在我的 DLL 中声明了这些函数。如果我在独立应用程序中使用它们,一切顺利,但在服务中使用它们时,我没有得到任何结果。没有钩子。

function HookProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result := CallNextHookEx(Code, code, wParam, lParam)
end;

procedure StartHook; stdcall;
begin
  HookHandle := SetWindowsHookEx(WH_GETMESSAGE, HookProc, hInstance, 0);
end;

procedure StopHook; stdcall;
begin
  UnhookWindowsHookEx(HookHandle);
end;

问题仅存在于 Vista 及更高版本。

4

1 回答 1

2

您正在尝试将应用程序挂接到不同的桌面上。参数的文档dwthreadId告诉SetWindowsHookEx您不能这样做:

与挂钩过程关联的线程的标识符。如果此参数为零,则挂钩过程与在与调用线程相同的桌面上运行的所有现有线程相关联。

请记住,Vista up 中的会话 0 隔离意味着您的服务在与任何交互式桌面不同的会话(因此也就是不同的桌面)中运行。

我想还有其他原因会从会话 0 停止此工作。您将需要从与您希望挂钩的进程位于同一桌面的进程中运行此代码。

于 2012-05-01T00:31:02.710 回答