0

3 つの単純なプログラムがあり、それぞれが単純なウィンドウです。プロセスの 3 つすべてを開始し、プログラム 1 または 2 のボタンをクリックして、プログラム 3 のウィンドウを表示します。
プログラム 1 と 2: ボタンは 1 つだけです。クリックすると、プログラム 3 の非表示のプロセス (ウィンドウでもあります) が表示されます。
プログラム 3: 隠しプロセスとして起動し、プログラム 1 と 2 のメッセージを待ってからポップアップします。ボタンを押すかどうかによって、ウィンドウのキャプションがプログラム 1 または 2 のキャプションに変わるはず

です。この動作を行うためにどの関数を使用するか、またはスレッドを使用すればよいかわかりません。これを行うには、ある種のスレッドを使用する必要があると思います..最初にプログラム3を非表示にしてから、プログラム1と2のメッセージを待ちます..何かアイデアはありますか?

編集: 私は C++ を使用していますが、セマフォを使用するように指示されています。

4

2 に答える 2

1

Windows Eventを使用することをお勧めします。具体的には、手動リセット イベントです。プログラム 3 は、イベントを待機します。プログラム 1 またはプログラム 2 がウィンドウを起動したい場合、イベントを設定します。プログラム 3 が非表示に戻ると、イベントがクリアされます。

SendMessageまたはを使用することもできますPostMessageが、イベントの方がはるかに簡単でわかりやすいようです。また、特定の利点もあります。

  • プログラム 1 とプログラム 2 は、プログラム 3 のウィンドウ ハンドルを見つけたり、他のプロセスによって傍受される可能性のあるメッセージをブロードキャストしたりする必要はありません。
  • イベントにセキュリティ属性を追加して、不正なプログラムがイベントにアクセスするのを防ぐことができます。
  • メッセージ ループを実行しているかどうかに関係なく、コンソール アプリケーション、Windows サービス、またはその他のプロセスからこの手法を使用できます。
  • Windows メッセージを使用するよりも (とにかく、私にとっては) 理解しやすいです。

これは、セマフォの適切な使用法ではありません。通常、セマフォは、複数の共有リソースへのアクセスを同期するために使用されます。ここで必要なのは、プログラム 3 が通知を待機し、プログラム 1 またはプログラム 2 がその通知を送信できるようにすることだけです。

プログラム 1 からプログラム 3 にデータを渡す必要がある場合、イベントは役に立ちません。メモリ マップド ファイル、パイプ、ネットワーク ソケットなどの通信方法、またはその場合は Windows メッセージなどを考え出す必要があります。しかし、単純な「ねえ、起きて!」通知、私はイベントを使用します。

于 2013-03-22T18:37:06.907 に答える
1

プロセスの境界を越えて単純なメッセージをやり取りする必要があるため、SendMessageファミリーの何かを使用することをお勧めします。まず、ターゲット ウィンドウのハンドルを取得する必要があります。この関数はウィンドウ API ではかなり低レベルであるため、C/C++ から直接アクセスすることしかできませんが、使用している言語を指定していませんでした。これにはラッパーがあると思います。 C# からもアクセスできる CLR のルーチン。

于 2013-03-22T17:37:15.260 に答える