別のWindowsのユーザーセッションで起動したアプリケーションにメッセージを送ります
質問
(Delphiで作られた)のデスクトップアプリはのは、「インスタンスA」と呼んでみましょうユーザAによって開始されます。
ユーザAは "スイッチ・ユーザ" とユーザBログのを行います。
ユーザBは、同じアプリケーションを実行します。のは、「インスタンスB」と呼んでみましょう。
私が今欲しい、インスタンスBは、インスタンスAにメッセージを送信するための方法です。
私は次のことを試してみました:インスタンスBは、そのファイルを開いてハンドルを読み、インスタンスAにメッセージを投稿するためにそれを使用しますが、それは動作しませんことができるようにインスタンスAは、ファイル内でそのハンドルを書き込みます - おそらくのためにセキュリティ上の理由から、Windowsは、別のユーザーの実行中のプロセス...
のハンドルに一のユーザーのアクセス権を与えるものではありませんこれを行うには、「悪い」の方法は、インスタンスBが何かを書くことができますし、インスタンスAはそれを取得しますので、インスタンスAは、特定のファイルやレジストリの場所数秒ごとにチェック持っているだろう...しかし、これは明らかに負担ですそしてunelegantソリューションます。
その代わり、私は必要なものをインスタンスAがウェイクアップし、それから約するかを決定した後に、ユーザAのインスタンスAに無害なメッセージを送信するために、ユーザBのインスタンスBのための方法である。
任意の提案をありがとう!
解決
あなたはのSendMessage、のPostMessageと同様の機能を使用することはできません。
あなたはグローバル名前空間には、セマフォなどの名前付きパイプを使用することができますされている(すなわち、「グローバル\」で始まる名前を持ちます)。その後、例えば、これらのいずれかから「信号」までの睡眠が到着し、それに応じて、メインウィンドウに通知されます、あなたのアプリケーション内の別のスレッドを作成します。
リソースを節約するために、WTSRegisterSessionNotificationは、セッションスイッチが発生したときに通知を受けるために使用するとのみ、その時点でスレッドを作成します。
ここで詳細情報: http://support.microsoft.com/kb/310153する そしてここ: http://msdn.microsoft.com/en-us/library/ms997634。 ASPXする
他のヒント
これはシステムアカウントで実行するWindowsサービスを有し、かつ、いくつかのアプリケーションのユーザーインスタンスを持つと本質的に同じ問題ではありませんと通信?その後、多分あなたは、プロセス間通信(名前付きパイプなど)のためのgoogleなければなりません。
また、UDPまたはTCP / IPを使用する場合がありますが、私は、名前付きパイプを使用して(私は実際にそれをやったことがないが)「ローカル」の通信のための優れていることを推測します。
ここの上の名前付きパイプについてを読みますMSDNます。