我在我的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及以上。
答案 0 :(得分:2)
您正尝试在不同的桌面上挂钩应用程序。 dwthreadId
的{{1}}参数的文档告诉您不能这样做:
与钩子过程相关联的线程的标识符。如果此参数为零,则挂钩过程与在与调用线程相同的桌面中运行的所有现有线程关联。
请记住,Vista中的会话0隔离意味着您的服务在与任何交互式桌面不同的会话(因此是不同的桌面)中运行。
我认为还有其他原因可以阻止这个工作从会话0开始。您将需要从与您希望挂钩的进程位于同一桌面的进程中运行此代码。