2012-04-30 8 views
2

私のDLLにこれらの関数が宣言されています。私がスタンドアロンアプリケーションでそれらを使用すると、すべてうまくいくが、サービスでそれらを使用するとき、私は結果を得ない。フックはありません。サービスからインストールしたときにフック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以上でのみ発生します。

+3

ビスタで埋められたセキュリティホールを埋めるのは恐れている。サービスはそれぞれのセッションで実行されます。ここで「サービスとフック」を検索すると、答えが見つからないような質問がたくさんあります。あなたは、コミュニケーションの他の方法を考え出す必要があります。 –

答えて

2

異なるデスクトップにアプリケーションをフックしようとしています。

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

Vistaのセッションが分離されるということは、サービスがインタラクティブデスクトップとは異なるセッション(したがって別のデスクトップ)で実行されることを意味します。

セッション0からこの作業を停止する理由が他にもあると思います。このコードを、フックするプロセスと同じデスクトップにあるプロセスから実行する必要があります。

関連する問題