VC# .NETについて質問です。


サクラエディタのタブモードのように、プログラムを起動した際、既に起動している同名のプロセスがあればそのプロセスにあるタブを追加させる、という処理はどうやったらいいのでしょうか?

多重起動の検出方法や単なるタブの追加方法は把握しています。
同名のプロセスに対してアクションを起させる方法を教えて下さい。

⇒環境
Microsoft Visual C# 2008 Express Edition

回答の条件
  • 1人2回まで
  • 登録:2008/10/06 21:39:43
  • 終了:2008/10/08 19:47:30

回答(3件)

id:angemaries No.1

angemaries回答回数80ベストアンサー獲得回数22008/10/07 01:06:50

ポイント10pt

Excelでも既に起動していれば、同じプロセスにウインドウが追加になります。

これと同じことを言われていると思います。

Excelの場合は拡張子の関連付けのオープンにDDEの設定がされています。

同じようにDDEのメッセージを飛ばせば同じことができます。

http://e-words.jp/w/DDE.html

id:kiku-_-san

ご回答ありがとうございます。

そうです、Excelと同じ動作をさせたいのです。

DDEについて調べましたが、今回の件を実現出来るようなサンプルコードが見つかりませんでした。

もしサンプルコードがありましたらお手数お掛けしますがお教え下さい。

2008/10/07 21:56:04
id:ardarim No.2

ardarim回答回数896ベストアンサー獲得回数1442008/10/07 03:39:33

ポイント35pt

プロセス(スレッド)間で同期をとる方法を利用します。


いくつか方法がありますが、例えば名前付きイベントを利用する方法があります。

(1)EventWaitHandleで、名前付きのシステムイベントを作成します。

(2)最初に起動したプログラム(A)は、EventWaitHandle.WaitOneでイベントの待ち合わせを行います。(待ち合わせ用のスレッドを1つ起こす必要があります)

(3)2番目以降に起動するプログラム(B)は、EventWaitHandle.Setでプログラム(A)にイベントを通知します。

(4)プログラム(B)がEventWaitHandle.Setを実行すると、プログラム(A)はWaitOneの待ち合わせが終了して次の行に制御が移ります。ここで、タブを追加するなどのアクションを行います。3番目以降のプログラムからのイベントを待つため、再度(2)へループしてWaitOneで再び待ち合わせに戻ります。


EventWaitHandleで、同じ名前を付けて作成したシステムイベントは、システム全体で有効なので、別々のプロセスで共有できます。

id:kiku-_-san

ご回答ありがとうございます。

試してみましたが、短いコードで実現出来そうなので非常にありがたいです。

ただ、プログラムBからプログラムAへ値を渡せないのが痛いです。

値を渡すには、プログラムBで一時ファイルに値を書き込んでそれをプログラムAで読み取るしかないのでしょうか?

2008/10/07 22:00:49
id:ardarim No.3

ardarim回答回数896ベストアンサー獲得回数1442008/10/08 00:03:59

ポイント35pt

ネイティブ(アンマネージド)であれば、共有メモリを使うのが一番簡単で性能も良いのですが。

C#.NETでプロセス間で値をやり取りするのであれば、MessageQueueあたりでしょうか?

Windowsのセットアップ(コンパネ)で、メッセージキューコンポーネントを追加インストールする必要がありますが、共通の名前のMessageQueueを作ることで、プロセス間でも任意のデータを簡単に送信したり受信したりできます。


送信側は、MessageQueue.Sendで任意のオブジェクトを送り、受け側はMessageQueue.Receiveで受信した後、元のデータ型にキャストします。Receiveの説明中に簡単な送受信のサンプルがありますので参考にしてください。かなり簡単です。

使い方としては、待ち合わせスレッド側でMessageQueue.Receiveを実行します。送信側からMessageQueue.SendされるまでReceiveの処理はブロックしますので、Receiveの後の処理で受け取ったデータを使ってタブの追加など必要な処理を行います。


.NET Frameworkでは、一応プロセス間通信の方法としてはリモーティングという方法が用意されているようですが、ちょっと簡単に使いたいと言うような感じではなさそうです。

あとはWindowメッセージを使うか、共有メモリを使うか、いずれにしてもP/Invokeでネイティブの呼出しを利用する必要があります。

id:kiku-_-san

配布を前提とした場合、Windowsのセットアップが絡むのはちょっとキツいですね。。。

なので一時ファイルで対応したいと思います。

ありがとうございました。

2008/10/08 19:46:35

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません