DOBON.NET DOBON.NETプログラミング掲示板過去ログ

同じアプリでファイルを既に開いている場合そのプロセスをアクティブにする方法

環境/言語:[VB2008]
分類:[.NET]

こんにちは。ピンフと申します。
VB2008で、独自定義のファイルに記載された情報を表示するためのソフトを開発しています。
独自情報ファイルには独自の拡張子をつけ、このファイルをダブルクリックするとこのファイルを開発ソフトで開くようにしたいと思っていますが、
この時、このソフトですでに開いている場合には、このファイルを開いているプロセスをアクティブにして、
新しくソフトを起動しないようにしたいと考えています。
それ以外の場合は、ソフトの多重起動ができるようにしたいです。

ソフトの多重起動禁止については、ネットで調べたSystem.Threading.Mutexのサンプルを見よう見まねでやってみたことがありますが、
このような場合、同じソフトのプロセスを見に行って、そのプロセスで読み込まれているファイルのパスを調べて起動判断を行う、
ということは可能なのでしょうか?
■No29004に返信(ピンフさんの記事)

Process.GetProcessesByName(プロセス名)
で起動しているプロセスを取得出来るので

AppActivate(Process.Id)
でアクティブになります。
■No29006に返信(shuさんの記事)

> Process.GetProcessesByName(プロセス名)
> で起動しているプロセスを取得出来るので

shuさん、ありがとうございます。
同じソフトのプロセスはこれで取得できそうですが、
そのプロセスが表示している独自ファイルが何かを調べるにはどうすればよいでしょうか?

例えば、同じソフトのプロセスAが、Faというファイルを表示しているものとします。

ケース1:
 ファイルFaをダブルクリックしてソフトを起動させようとした場合、すでにプロセスAがこのファイルFaを表示しているので、プロセスAをアクティブにし、
 新たなプロセスは終了します。

ケース2:
 ファイルFbをダブルクリックしてソフトを起動させようとした場合、Fbを開いている同ソフトのプロセスはありませんので、
 新たなプロセスを起動し、ファイルFbを表示します。

おそらく、各プロセスで表示しているファイルの情報を何らかの形で他プロセスに知らせるようなことが必要なのだと思いますが、
このようなことは可能なのでしょうか?
■No29008に返信(ピンフさんの記事)

同一ファイル名の部分を読み落としていました。
プロセス間通信をするか
メイン画面のタイトルにファイル名を表示しておいて、
Process.MainWindowTitleで取得するとか?
■No29010に返信(shuさんの記事)

shuさん、いつもお世話になります。

> プロセス間通信をするか
> メイン画面のタイトルにファイル名を表示しておいて、
> Process.MainWindowTitleで取得するとか?

プロセス通信ですか。ちょっと私にはレベルが高そうな課題です。
この際ですからプロセス通信をやってみたいと思いますが、ネットで調べるとサーバーとかクライアントとか出てきて
頭の中を整理するのに時間がかかりそうです。
この場合のサーバー/クライアントとは、受信側と送信側という意味に解釈してOKでしょうか?(どっちがどっちかは理解していません。)

以下のサイトに同様の質問がありましたが、そこに記載されている肝心のリンク先が見れなくなっています。
(wankumaというサイトが見れなくなっています。)

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43359&forum=7

その他、このようなケースのプロセス通信について参考になるサイトはございますでしょうか?
■No29011に返信(ピンフさんの記事)

Windowsでのプロセス間通信にはSocketを使う方法と
WindowMessageを使う方法があります。
WM_COPYDATAを使う方法が
http://www.geocities.jp/hatanero/sendmessage2.html
に載っていました。

DOBON.NET | プログラミング道 | プログラミング掲示板