DOBON.NET どぼん!のVB道掲示板(プログラム)過去ログ

多重起動時に、最初に起動したプロセスのメソッドを実行したい

はじめまして、VB2〜VB.net まで趣味でプログラムやってる Re-In といいます。いつも参考にさせて頂いています。今回の質問は、〜VB6の時もずっと謎だったのですが、.net での方法で、良い方法をご存じでしたら教えてください。よろしくお願いします。

アプリケーションの起動時に、二重起動をチェックし、既に起動されている時はそのプロセスは終了させ、起動していた方のプロセスのメソッドを実行させたいのですが、可能でしょうか?

目的は、シングルウィンドウのアプリケーションを複数起動可能なソフトを作りたいのですが、複数プロセスで起動されるととても重いので、出来ればプログラム中で new フォーム して新しいウィンドウを開きたいのです。二重起動禁止のプログラムでは、自プロセスと同名の他のプロセスがあるか?探していますが、ここで見つかった時には、見つけたプロセスの moduleのメソッドなどを実行、その後、自プロセスは終了 というように出来ますか?もしくは他にもっとシンプルな方法があるのでしょうか?

よろしくお願いします。
>はじめまして、VB2〜VB.net まで趣味でプログラムやってる Re-In といいます。いつも参考にさせて頂いています。今回の質問は、〜VB6の時もずっと謎だったのですが、.net での方法で、良い方法をご存じでしたら教えてください。よろしくお願いします。
>
>アプリケーションの起動時に、二重起動をチェックし、既に起動されている時はそのプロセスは終了させ、起動していた方のプロセスのメソッドを実行させたいのですが、可能でしょうか?

今まででしたら多分DDEを使う方法かSendMessageでメッセージを送る方法が普通なのかなと思いますが、.NETではDDEが使えなくなったので、むしろ選択肢が狭まったような気もします。もしかしたらもっといい方法があるのかもしれませんが、私は知りません。
ありがとうございます。早速 SendMessage を使ってやってみたのですが、送信は出来ているのかもしれませんが、受信する方法が記述できない事に気付きました。

VB6までだと SetWindowLong にメソッドの AddressOf を渡すことが出来ましたが、VB.net だと デリゲート という考え方として追加されているため、integer(旧Long)の引数に渡す事が出来ません。その他にメッセージをフックできそうな方法も見つけられませんでした。メッセージの送信も intPtr や LenB廃止 などで正しく行えていないかもしれませんが・・・

ということで、もっと別の方法があるのか?それとも全く出来ないことなのか?
・・・もう少し調べてみたいと思います&もし良い方法がありましたら、サンプル、期待してます。よろしくお願いします。
>ありがとうございます。早速 SendMessage を使ってやってみたのですが、送信は出来ているのかもしれませんが、受信する方法が記述できない事に気付きました。

フォームクラスのWndProcメソッドをオーバーライドすればできるのではないかと思います。
>フォームクラスのWndProcメソッドをオーバーライドすればできるのではないかと思います。

ありがとうございます!プロテクトメソッドにあったのですね。気付きませんでした。

早速試してみました。メッセージ送信時に wMSG に VM_USER を指定していたのを取得して、メッセージが送られたことを受け取ることは出来ました。しかし、lParam に格納しておいたデータの構造体を受け取る事は出来ませんでした。

まず、m.GetLParam というメソッドがあるのですが、これの使い方がよくわかりませんでした。そこで、m.lParam プロパティ(intPtr)から構造体にデータを移すべく、Marshal.StructureToPtr を使ってみると インスタンスがない といったエラーメッセージが出てしまいます。どうも IntPtr の使い方を勘違いしてるのかもしれません。

VBの範囲外については不勉強で、Windowsメッセージについてもよくわかっていないので、送信のほうが出来てないのかもしれません。(受信側に Message構造体 が用意されていますが、送信メソッドが見つかりません。う〜ん、また見つけられてないだけな気がしますが・・・)

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