人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

⇒環境
Microsoft Visual C# 2008 Express Edition


●質問者: kiku-_-san
●カテゴリ:コンピュータ
✍キーワード: .NET C# EXPRESS Microsoft VC
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● angemaries
●10ポイント

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

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

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

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

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

◎質問者からの返答

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

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

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

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


2 ● ardarim
●35ポイント

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


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

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

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

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

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


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

◎質問者からの返答

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

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

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

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


3 ● ardarim
●35ポイント

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

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

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


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

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


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

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

◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ