Windowsサービスがユーザーウィンドウにメッセージを送信するための特別な考慮事項はありますか?
-
03-07-2019 - |
質問
イベントを監視するWindowsサービスアプリケーション(GUIなし)を作成する必要があります。イベントが発生すると、標準のWindowsメッセージがアプリケーションに送信されます。アプリケーションのハンドルはDLLによってサービスに渡され、その後DLLがアンロードされるため、Windowsメッセージが使用したい方法です。
しかし、問題は、Vistaの別の画面または何かにある可能性があるため、サービスがウィンドウハンドルに対してSendMessageを使用するために特別なことを行う必要があるかどうかです。これは可能ですか?もし可能なら、どうすればいいですか?
解決
ユーザーインターフェイス権限分離(UIPI):
Microsoft Windows Vista以降。 メッセージ送信はユーザーの対象です インターフェイス特権分離(UIPI)。 プロセスのスレッドは送信できます 次のメッセージキューへのメッセージのみ より小さいまたは 整合性レベルが等しい。
ユーザーインターフェイス権限分離(UIPI)についてはこちらをご覧ください。
これを回避するには、マニフェストファイルでuiAccessをtrueに設定します。また、VeriSignなどの署名機関からの証明書でauthenticodeを使用してアプリケーションが署名されていることを確認する必要があります。これはかなり高価になる可能性があります。
セッション0の分離:
また、セッション間でSendMessageを呼び出すことはできないと考えています。したがって、セッション0で実行されているサービスがある場合、セッションで実行されるプロセスと通信する別の手段を見つける必要があります> 0.例:パイプ経由。
Windows Vistaでは、Windows 2008 Server以降のすべてのサービスはセッション0で実行され、開始したすべてのアプリケーションはセッション>で実行されます。 0.これは、セッション0分離と呼ばれます。以下は、セッション0分離に関するすべての情報を含む優れたドキュメントです。
メッセージを送信するプログラムのソースにアクセスできない場合は、サービスと通信し、プロキシとして機能してアプリケーションにメッセージを中継するアプリケーションを作成することで、これを回避できます同じセッション。
全体:
Vistaより前でアプリケーションを開発し、正常に動作する場合。 Vistaでは、非常に高い確率で破損する可能性があります。