プロが教えるわが家の防犯対策術!

Visual Basic6で
(1)test.exeを起動する
(2)もう1回、test.exeを起動する
ここで、(1)のtest.exeを終了して(2)のtest.exeを新たに起動したいです。

二重起動の禁止の方法は色々見つかるのですが、どれも2回目に起動した方を終了してしまいます…。
よろしくお願いします。

A 回答 (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で充分です。
相手がフリーズしていても自分自身はフリーズしないからです。
    • good
    • 0

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
としてやれば 複数回起動のアプリから前回起動のアプリを終了させられます
    • good
    • 0

フォームをサブクラス化して 前のアプリに対して終了しろと命令すればいいでしょう



サブクラス化については 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回目に起動したアプリが終了できないようです
    • good
    • 0

動作中プロセスを列挙して、その中で自分のものと同一の名前のものを探す。


見つかったならプロセスIDを確認し、自分のものでなければ終了させる。

先行動作中のものを無理にとめるのはよろしくない方法です。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています