1

イベントを監視するWindowsサービスアプリケーション(GUIなし)を作成する必要があります。イベントが発生した場合は、標準のWindowsメッセージがアプリケーションに送信されます。アプリケーションのハンドルはDLLによってサービスに渡され、DLLはアンロードされるため、Windowsメッセージが使用したい方法です。

ただし、問題は、サービスがウィンドウハンドルにSendMessageを使用するために特別なことを行う必要があるかどうかです。これは、Vistaの別の画面または何かにある可能性があるためです。これは可能ですか?もしそうなら、私は何をしなければなりませんか?

4

1 に答える 1

7

ユーザーインターフェイス特権の分離(UIPI):

MicrosoftWindowsVista以降。メッセージの送信は、ユーザーインターフェイス特権の分離(UIPI)の対象となります。プロセスのスレッドは、整合性レベルが低いか等しいプロセスのスレッドのメッセージキューにのみメッセージを送信できます。

ソース

ここで、ユーザーインターフェイス特権の分離(UIPI)について読むことができます。

これを回避するには、マニフェストファイルでuiAccessをtrueに設定します。また、VeriSignなどの署名機関からの証明書を使用してauthenticodeを使用してアプリケーションが署名されていることを確認する必要があります。これはかなり高価になる可能性があります。


セッション0の分離:

また、セッション間でSendMessageを呼び出すことはできないと私は信じています。したがって、セッション0で実行されているサービスがある場合は、セッション> 0で実行されるプロセスと通信するための別の手段を見つける必要があります。例:パイプ経由。

Windows Vistaでは、Windows 2008 Server以降のすべてのサービスはセッション0で実行され、開始するすべてのアプリケーションはセッション>0で実行されます。これはセッション0の分離と呼ばれます。これは、セッション0の分離に関するすべての情報を含む優れたドキュメントです。

メッセージを送信するプログラムのソースにアクセスできない場合は、サービスと通信し、同じセッションでアプリケーションにメッセージを中継するプロキシとして機能するアプリケーションを作成することで、これを回避できます。 。


全体:

以前のVistaでアプリケーションを開発し、それが正常に機能する場合。Vistaでは壊れてしまう可能性が非常に高いです。

于 2009-03-05T15:20:42.793 に答える