2

デスクトップアプリ(Delphi製)はユーザーAによって起動されます。これを「インスタンスA」と呼びましょう。

ユーザーAは「ユーザーの切り替え」を行い、ユーザーBはログインします。

ユーザーBは同じアプリケーションを実行します。それを「インスタンスB」と呼びましょう

私が今欲しいのは、インスタンスBがインスタンスAにメッセージを送信する方法です。

私は次のことを試しました:インスタンスAはそのハンドルをファイルに書き込むので、インスタンスBはそのファイルを開き、ハンドルを読み取り、それを使用してインスタンスAにメッセージを投稿できますが、機能しません-おそらくセキュリティ上の理由でWindowsあるユーザーに別のユーザーの実行中のプロセスのハンドルへのアクセスを許可しません...

これを行う「悪い」方法は、インスタンスAに特定のファイルまたはレジストリの場所を数秒ごとにチェックさせることです。これにより、インスタンスBはそこに何かを書き込むことができ、インスタンスAはそれを取得します...しかし、これは明らかに面倒で不法な解決策です。 。

代わりに、私が必要としているのは、ユーザーBのインスタンスBがユーザーAのインスタンスAに無害なメッセージを送信する方法です。その後、インスタンスAが起動し、それについて何をすべきかを決定します。

提案をありがとう!

4

2 に答える 2

3

異なるユーザーセッションのアプリケーションインスタンスをアプリケーションで使用できないため、SendMessage、PostMessageなどの関数を使用することはできません。

使用できるのは、グローバル名前空間の名前付きパイプ、セマフォなどです(つまり、名前の前に「Global」が付いています)。次に、アプリケーションに別のスレッドを作成します。たとえば、これらのスレッドの1つからの「シグナル」が到着するまでスリープし、それに応じてメインウィンドウに通知します。

リソースを節約するには、WTSRegisterSessionNotificationを使用して、セッションの切り替えが発生したときに通知を受け取り、その時点でのみスレッドを作成します。

詳細については 、http://support.microsoft.com/kb/310153 およびここ:http: //msdn.microsoft.com/en-us/library/ms997634.aspxを参照してください。

于 2009-11-04T15:09:19.817 に答える
1

これは、Windowsサービスをシステムアカウントで実行し、一部のアプリケーションのユーザーインスタンスがそれと通信するのと本質的に同じ問題ではありませんか?次に、プロセス間通信(名前付きパイプなど)をグーグルで検索する必要があります。

UDPまたはTCP/IPを使用することもできますが、名前付きパイプを使用する方が「ローカル」通信に適していると思います(実際に使用したことはありませんが)。

MSDNの名前付きパイプについてはこちらをお読みください。

于 2009-11-04T13:12:44.933 に答える