Delphi 为什么';当从服务安装时,我的hook DLL不能工作吗?

Delphi 为什么';当从服务安装时,我的hook DLL不能工作吗?,delphi,dll,windows-vista,hook,Delphi,Dll,Windows Vista,Hook,我在DLL中声明了这些函数。如果我在一个独立的应用程序中使用它们,一切都会很顺利,但在服务中使用它们时,我不会得到任何结果。没有钩子 function HookProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; begin Result := CallNextHookEx(Code, code, wParam, lParam) end; procedure StartHook; stdcall; be

我在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及以上版本。

您正在尝试将应用程序挂接到其他桌面上。的
dwthreadId
parameter的文档告诉您不能执行此操作:

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

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


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

恐怕Vista堵塞了一个巨大的安全漏洞。服务在它们自己的会话中运行。如果你在这里搜索“服务和挂钩”,你会发现大量问题的答案是你不能。你必须想出另一种通信方式。