• 締切済み

VB6での二重起動(複数起動)の制御について

Visual Basic6で (1)test.exeを起動する (2)もう1回、test.exeを起動する ここで、(1)のtest.exeを終了して(2)のtest.exeを新たに起動したいです。 二重起動の禁止の方法は色々見つかるのですが、どれも2回目に起動した方を終了してしまいます…。 よろしくお願いします。

みんなの回答

回答No.4

一番簡単な方法は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)
回答No.3

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)
回答No.2

フォームをサブクラス化して 前のアプリに対して終了しろと命令すればいいでしょう サブクラス化については 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)
回答No.1

動作中プロセスを列挙して、その中で自分のものと同一の名前のものを探す。 見つかったならプロセスIDを確認し、自分のものでなければ終了させる。 先行動作中のものを無理にとめるのはよろしくない方法です。

関連するQ&A