0

createProcessAsUser でカスタム アプリケーションを実行するための Windows サービスを作成しました。その結果、予想どおり、セッション ID 0 の SYSTEM ユーザーで実行されている 1 つのアプリケーションが作成されます。私の問題は、このアプリケーションと現在のユーザーが作成した他のアプリケーションとの間で通信を行う必要があることです。

デスクトップ イベント (SC_SCREENSAVE、モニター オフ) が発生した場合、現在のユーザー アプリによってイベントがキャッチされた場合、SYSTEM アプリケーションにそれを伝える必要があります。利用した:

SendMessage(HWND_BROADCAST, CURRENT_USER_HAS_DONE_SOMETHING, 0, 0);

SYSTEM アプリケーションが多くのシステム イベント (サスペンド、ログオフなど) をキャッチし、同じセッション ID で実行されている場合でも、カスタム メッセージがキャッチされることはありません。Sendmessage が SYSTEM ユーザーに対して機能しないようです。

ユーザーの現在のセッションから SYSTEM アプリケーションにメッセージを送信するにはどうすればよいですか?

4

3 に答える 3

2

もう 1 つのオプションは、ユーザー定義の制御コードと共に古いControlService 関数を使用することです。複雑な通信には適していません (サービスにパラメーターを渡すことはできません) が、概説した単純な「何かが起こった」通知には適しています。

于 2013-03-12T14:38:31.617 に答える
1

最近のバージョンのWindowsでは、セッション0とデスクトップセッションの間でメッセージを交換することはできません。これは、セッション0分離と呼ばれます。

あなたはここここでより多くの情報を見つけることができます。

通常の代替手段は、TCP / IP、パイプ、リモート処理などであり、これらはこのSO回答で説明されています。

于 2013-03-12T10:21:25.773 に答える
1

明らかに、メッセージのブロードキャストは正しい解決策ではありません。より良い解決策はおそらくCreateEventExです。これにより、名前付きイベントが作成されます。その後、通常のアプリが電話SetEventをかけ、SYSTEMアプリはこのイベントを待つことができます。

于 2013-03-12T10:22:58.847 に答える