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これを行うことができないことが示されています。

フック プロシージャが関連付けられるスレッドの識別子。このパラメーターが 0 の場合、フック プロシージャは、呼び出し元のスレッドと同じデスクトップで実行されているすべての既存のスレッドに関連付けられます。

Vista アップでのセッション 0 の分離は、サービスが対話型デスクトップとは異なるセッション (したがって異なるデスクトップ) で実行されることを意味することに注意してください。

セッション 0 からこれが機能しなくなる理由は他にもあると思います。フックしたいプロセスと同じデスクトップにあるプロセスからこのコードを実行する必要があります。

于 2012-05-01T00:31:02.710 に答える