delphi - 为什么从服务安装时我的钩子(Hook) DLL 不起作用?

标签 delphi dll windows-vista hook

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

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 及更高版本。

最佳答案

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

The identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread.

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

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

关于delphi - 为什么从服务安装时我的钩子(Hook) DLL 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10390466/

相关文章:

.net - 有没有办法查看.net dll中的资源

c - MinGW w64 缺少 dll

c++ - 使用 CreateRemoteThread API 时如何修复 "LPVOID: unknown size"错误?

delphi - 如何在 Vista 文件打开对话框中禁用通配符模式的自动附加

windows-vista - 在 Windows Vista 上,我可以使用任何帐户将数据写入何处,并且可以从所有其他帐户查看?

Delphi TBitmap - 为什么 Pixels 和 ScanLine 不同?

delphi - 使用 ToolsAPI 将菜单项添加到 Delphi IDE 中单元的选项卡上下文菜单

delphi - 自定义控件中的子面板是否可以接受设计器的控件?

delphi - 接口(interface)委托(delegate)+重写

windows-7 - 无法使用 Windows 命令提示符打印双字节字符