• 締切済み

他のアプリケーションの終了処理

Shell関数を使って起動した他アプリケーションを 今度はその、他アプリケーションからではなく、V Bで作成したメイン画面の終了と同時に終了させた いのですが方法、又は適切な文法が分かりません。 よろしくお願いします。 ※ちなみにVBで作成したメイン画面の終了と同時 に終了させたい他アプリケーションは1つだけです。 しかも決まったパスに置いていて、この先もずっと 固定です。条件としては以上です。

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

起動したアプリがウィンドウを持つアプリであれば、 WindowsAPIのPostMessage()でWM_CLOSEをポストして終了させるのが安全です。 で、メッセージをポストするには送信先のウィンドウのウィンドウハンドル(hWnd)を取得する必要があります。 手軽にhWndを取得するにはWindowsAPIのFindWindow()を使うのが楽です。 Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Const WM_CLOSE = &H10 Sub ShutdownOtherApp 'ウィンドウハンドルの取得 Dim hWnd As Long hWnd = FindWindow(vbNullString, "終了させるウィンドウのキャプション") 'メッセージをポスト Call PostMessage(hWnd, WM_CLOSE, 0, 0) End Sub ただし、同じキャプションのウィンドウが複数立ち上がっている状態では、FindWindow()では ウィンドウを一意に特定できないので、Shellで起動したときの戻り値のプロセスIDと 同じプロセスであるかをチェックしながらウィンドウを調べていく必要があります。 列挙の方法はこちらをどうぞ。 http://www.vbvbvb.com/jp/gtips/0751/gEnumWindows.html Declare Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As Long, lpdwProcessId As Long) As Long Dim PId As Long PId = Shell("アプリ名", vbNormalFocus) ・ ・ ・ '列挙されたウィンドウハンドルに対しての処理です。 Dim wndPId as Long 'ウィンドウハンドルからプロセスIDを取得 Call GetWindowThreadProcessId(hWnd. wndPId) '同一であれば起動したプロセスだということ If PId = wndPId Then 'WM_CLOSEをポスト Call PostMessage(hWnd, WM_CLOSE, 0, 0) End If

参考URL:
http://www.vbvbvb.com/jp/gtips/0751/gEnumWindows.html
すると、全ての回答が全文表示されます。
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答No.1

こんにちは。maruru01です。 前回の質問で他アプリケーションの終了の仕方はOKなのでしょうか。 (回答に対するお礼は補足がまったくないようですが。) いちおう参考URL載せますが。 http://www.users.gr.jp/ml/archive/vb/1708.asp (ただし、NT4.0はうまくいかないらしい。) で、あとはこれをメイン画面(フォーム)のUnLoadイベントにでも記述すればいいんじゃないでしょうか。

参考URL:
http://www.users.gr.jp/ml/archive/vb/1708.asp
すると、全ての回答が全文表示されます。

関連するQ&A