- 締切済み
VB6での二重起動(複数起動)の制御について
Visual Basic6で (1)test.exeを起動する (2)もう1回、test.exeを起動する ここで、(1)のtest.exeを終了して(2)のtest.exeを新たに起動したいです。 二重起動の禁止の方法は色々見つかるのですが、どれも2回目に起動した方を終了してしまいます…。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- kunkun_129
- ベストアンサー率64% (16/25)
一番簡単な方法は3行で可能です。 Windows の タイトル名(VB6ではme.caption) が「サンプル」とした場合、 Private Sub Form_Load() ret = FindWindow(vbNullString, "サンプル") If ret Then Call PostMessage(ret, WM_CLOSE, 0, 0) caption="サンプル" End Sub 注意点は、フォームをデザインで作成する時に、タイトル名(VB6ではme.caption)を 空白にしておくことです。 タイトル名は、Form_Load の3行目で代入します。 また、Sendmessage はできるだけ使わないで、PostMessage のが安全です。 Sendmessageの場合は、既に動作しているアプリケーションがなんらかの原因で フリーズしていた場合、自分自身もフリーズするからです。Sendmessageは確実 に相手が受け取る必要がある場合以外は、PostMessageで充分です。 相手がフリーズしていても自分自身はフリーズしないからです。
- redfox63
- ベストアンサー率71% (1325/1856)
myProcの終了判断用の変数を用意して if uMsg = uMsgExit and (bInstance = false) then としておき Form_Load側を lpfnPrevProc = SetWindowLong( Me.Hwnd, GWL_WNDPROC, addressof myPreoc ) bInstance = app.PrevInstance if bInstance then ' 自分以外の起動アプリがあるなら終了メッセージを投げる Sendmessage HWND_BRODCAST, uMsgExit, 0, 0 bInstance = False end if としてやれば 複数回起動のアプリから前回起動のアプリを終了させられます
- redfox63
- ベストアンサー率71% (1325/1856)
フォームをサブクラス化して 前のアプリに対して終了しろと命令すればいいでしょう サブクラス化については AddressOf関数の使い方などを調べてみましょう 前のアプリ終了用のメッセージとしてRegisterWindowMessageにより作成したLONG型の値を使います API用に 関数:RegisterWindowMessage, SetWidnowLong, CallWindowProc, SendMessage 定数:HWND_BROADCAST,GWL_WNDPROC,WM_CLOSE 変数: lpfnPrevProc,uMsgExit ... LONG型 Form_Loadで ' 終了用のメッセージをWindowsから取得 uMsgExit = RegisterWindowMessage("MyClose") ' 自身のWndProcを変更 lpfnPrevProc = SetWindowLong( Me.Hwnd, GWL_WNDPROC, addressof myPreoc ) if app.PrevInstance then ' 自分以外の起動アプリがあるなら終了メッセージを投げる Sendmessage HWND_BRODCAST, uMsgExit, 0, 0 end if といった具合にします myProcを if uMsg = uMsgExit and (app.PrevInstance = false) then ' 終了用メッセージで 自身が最初の起動の場合 SendMessage hwnd, WM_CLOSE, 0, 0 end if myProc = CallwidnowProc( lpfnPrevProc, hWnd, uMSg, wParam, lParam ) といた具合にします この方法では初回起動したアプリは終了できますが 3回目に起動したアプリから2回目に起動したアプリが終了できないようです
- wolf03
- ベストアンサー率22% (241/1086)
動作中プロセスを列挙して、その中で自分のものと同一の名前のものを探す。 見つかったならプロセスIDを確認し、自分のものでなければ終了させる。 先行動作中のものを無理にとめるのはよろしくない方法です。