とっておきの手土産を教えて

Shell関数を使って起動した他アプリケーションを
今度はその、他アプリケーションからではなく、V
Bで作成したメイン画面の終了と同時に終了させた
いのですが方法、又は適切な文法が分かりません。

よろしくお願いします。

※ちなみにVBで作成したメイン画面の終了と同時
に終了させたい他アプリケーションは1つだけです。
しかも決まったパスに置いていて、この先もずっと
固定です。条件としては以上です。

A 回答 (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 …


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 …
    • good
    • 0

こんにちは。

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
    • good
    • 0

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

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


おすすめ情報

このQ&Aを見た人がよく見るQ&A