• 締切済み

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

  • プログラムを複数(又は二重)起動しないように制御したい

    みなさんこんにちは 言語はVB6.0で、OSはWin2000Proです。 Main.exeというメニューにTest1.exeとText2.exeとい うプログラムを起動するボタンが二つあるとします。 Text1.exeを起動し、Text1.exeが起動している時に更に メニューからText1.exeを起動しようとした際、起動しな いように制御を行いたいのです。 この他、Text1.exeが起動している最中は、メニューから Text2.exeを起動しようとしても、やはり起動できないよ うにしたいのです。 良い方法はありますでしょうか? 色んなサイトで情報を収集してテストして見ましたが、 どうにも上手く行かず困っています。 よろしくお願いします。

  • 2重起動の制御に関して

    .netにてプログラムの2重起動チェックを行いたいのですが、 すでに起動済みのプログラムを起動しようとした場合、 起動されている方を終了してから後に起動された方を起動する ということは可能でしょうか? よろしくお願いします。

  • VB5.0 二重起動防止

    OSWin98/VB5.0を使用しています。同一のシステムの重複起動を防止したいのです。過去ログの、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=644390 を参照し、 http://www.vbvbvb.com/jp/gtips/1101/gCreateToolhelp32SnapshotTh32csSnapprocess.html のサンプルを参考にし、実行中のプロセスに同一のものがあれば、複数起動と判断するようにしました。 しかし、どうしても二重起動されてしまいます。 例1)A.exeを起動、A.vbpをデバッグで実行    →二重起動を検出し、後者は起動されない 例2)A.exeを起動、A.exeを起動    →二重起動が検出されず、後者も起動されてしまう App.PrevInstanceで判断できると思うのですが、例1と同じ方法でもこの場合は、二重起動を防ぐことができません。 他によい方法がある、ここがおかしいんじゃないの?等ありましたら、教えてください。 よろしくお願いします。

  • 二重起動禁止について

    VB6から.NETへ移行してきました。 VB6の時システムの二重起動を禁止するのは、プロパティの値を見るだけでしたが、.NETでの方法がわかりません。 どのようにすれば、二重起動が禁止できるのでしょうか?

  • 二重起動の禁止

    If App.PrevInstance = True Then End End If このコードで二重起動を禁止しているのですが、 たまに二重起動してしまいます。 確実に禁止できる方法はありませんか? (VB6)

  • VB6のShell制御について

    VB6のShell制御について 以前http://okwave.jp/qa/q6069911.htmlで 質問させていただき、解決することができました。 取引先などのダイアログexeを何本か開発し、連結テストをした際に PM経由でテスター(エンドユーザー)から「ダイアログ起動中は、起動基のexeを 触らせないようにできないか」と 指摘があり、修正をしています。 Shellのパラメータ等を弄ったり、書籍やネットを調べてみましたが 指摘を満たすようなサンプルが見つかりませんでした。 納期も近く、どのようにすれば指摘点を満たせるか教えていただけないでしょうか? 開発環境 Windows XP PRO SP4 Visual Basic6.0(SP6)

  • 2重起動の防止方法

    Microsoft Visual C++6.0でアプリケーションの2重起動の防止を実現する方法を教えて下さい。

  • タスクバーが二重表示されてしまう

    WindowsXPを使用中、何かのタイミングでタスクバーのウインドウ一覧が二重に表示されてしまいました。 Explorer.exeを一回終了させ、タスクマネージャからExplorer.exeを実行すると一度は直るのですが、これを起動時に毎回やるのでは困りものです。 解決方法などがありましたら、教えてください。 宜しくお願いします。

  • VB6でWSH(vbs)を起動できる方法を教えてください。

    visual Basic 6でアプリケーションを開発していますが、 このアプリケーション(exe)から、test.vbsを起動したいと考えています。 ====vbのコード===== 'ボタンクリックしたら、test.vbsが実行される Private Sub Command1_Click() shell("test.vbs") End Sub ==== test.vbs ==== MsgBox("test.vbs起動しました。") です。 上記のようにコードを書きましたが、Shell関数で 「実行時エラー'5' プロシージャの呼び出し、または引数が不正です。」 のメッセージが出力されて、vbsが起動できません。 VB6でWSH(vbs)を起動できる方法を教えてください。 環境は以下の通りです。 OS:WIN2000 アプリ:VB6 ブラウザ:IE5.0

  • vb.net2003での二重起動防止について

    度々お世話になっています。 vb.net2003でアプリケーションを作りました。 そこで二重起動防止を行いたい為に、Process.GetProcessesByName メソッドを使用して行いました。 二重起動防止は出来ているのですが、ターミナルサービスでリモートデスクトップ接続を行い、同一ユーザーの二重起動防止はしたいですが、1ユーザーでも使用していたら 別ユーザーで起動できません。 何か良い方法はありませんでしょうか? 出来れば解説しているサイトがあれば教えて下さい。

専門家に質問してみよう