アプリケーション内で
Shell を使い実行したプログラムを
同アプリケーション内で終了させる
にはどのようにしたら良いですか?
下記ではどうでしょう?
ttp://www.geocities.co.jp/SiliconValley/4805/vbtips/vbtips100.htm
TerminateProcessは強制終了なので少々具合の悪い場合があります。
(編集通のテキストなどがいきなり閉じてしまう。)
基本的には、PostMassage又SendMessageを使う方法が良いのですが、
アプリによってはハンドルが取れない場合がありその場合は
美しくないのですが、Sendkeysを使います。
メモ帳での両方のサンプルを簡単に書いておきます。
Private Declare Function SendMessageA Lib "user32" _
(ByVal hwd As Long, ByVal Msg As Long, ByVal wpara As Long, _
ByVal lpara As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetExitCodeProcess Lib "Kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" _
(ByVal dwAccess As Long, ByVal fInherit As Integer, _
ByVal hObject As Long) As Long
Private Declare Function CloseHandle Lib "Kernel32" _
(ByVal hObject As Long) As Long
Private Const STILL_ACTIVE = &H103&
Private Const PROCESS_QUERY_INFORMATION = &H400&
Private Const WM_CLOSE = 16
Private lngProcessID As Long
Private hProcess As Long
Private Sub Command1_Click()
'開く
lngProcessID = Shell("notepad.exe", vbNormalFocus)
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, True, lngProcessID)
End Sub
Private Sub Command2_Click()
'SendKeyで閉じる
Dim lngEndCode As Long
Dim lngEndRet As Long
lngEndRet = GetExitCodeProcess(hProcess, lngEndCode)
If lngEndRet <> 0 And lngEndCode = STILL_ACTIVE Then
AppActivate lngProcessID
SendKeys "%FX", True
DoEvents
lngEndRet = CloseHandle(hProcess)
End If
End Sub
Private Sub Command3_Click()
'SendMessageで閉じる
Dim lngHwd As Long
lngHwd = FindWindow("notepad", vbNullString)
SendMessageA lngHwd, WM_CLOSE, 0, 0
End Sub
ツイート | ![]() |