起動させたアプリケーションの終了を知る(U) <TOP>
FindWindow
クラス名またはキャプションを与えてウィンドウのハンドルを取得
GetWindowThreadProcessId
ウィンドウのプロセスIDとスレッドIDを取得
PostMessage 指定されたウィンドウを作成したスレッドに関連付けられているメッセージキューにメッセージをポストする
GetExitCodeProcess 指定プロセスの終了コードを取得
OpenProcess 既存のプロセスオブジェクトのハンドルを取得
'================================================================ '= 起動させたアプリケーションの終了を知る(U) '= (KeepWatch.bas) '================================================================ #include "Windows.bi" ' クラス名またはキャプションを与えてウィンドウのハンドルを取得 Declare Function Api_FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName$, ByVal lpWindowName$) ' ウィンドウのプロセスIDとスレッドIDを取得 Declare Function Api_GetWindowThreadProcessId& Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hWnd&, lpdwProcessId&) ' 指定されたウィンドウを作成したスレッドに関連付けられているメッセージキューにメッセージをポストする Declare Function Api_PostMessage& Lib "user32" Alias "PostMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any) ' 指定プロセスの終了コードを取得 Declare Function Api_GetExitCodeProcess& Lib "Kernel32" Alias "GetExitCodeProcess" (ByVal hProcess&, lpExitCode&) ' 既存のプロセスオブジェクトのハンドルを取得 Declare Function Api_OpenProcess& Lib "kernel32" Alias "OpenProcess" (ByVal dwDesiredAccess&, ByVal bInheritHandle&, ByVal dwProcessID&) #define STANDARD_RIGHTS_REQUIRED &HF0000'標準的な権利を要求することを示す定数 #define SYNCHRONIZE &H100000 '同期をとる #define STILL_ACTIVE &H103 'プロセス実行中 Var Shared Text1 As Object Var Shared Button1 As Object Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 '================================================================ '= '================================================================ Declare Function GetID(MyCaption As String) As Long Function GetID(MyCaption As String) As Long Var st As String Var ProcessID as long Var RetVal As Long Var Ret As Long RetVal = Api_FindWindow(ByVal 0, "無題 - メモ帳") If RetVal Then Ret = Api_GetWindowThreadProcessId(RetVal, ProcessId) Ret = Api_PostMessage(Ret, WM_CLOSE, 0, 0) 'プロセスID取得 GetID = ProcessId Exit Function End If 'プロセスID取得できない GetID = 0 End Function '================================================================ '= '================================================================ Declare Sub Watch() Sub Watch() Var Flag As Long Var CheckID As Long Var i As Long Var RetVal As Long Var Ret As Long CheckID = GetID("無題 - メモ帳") If CheckID = 0 Then Exit Sub End if Flag = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF RetVal = Api_OpenProcess(Flag, False, CheckID) 'ループして監視 Do Ret = Api_GetExitCodeProcess(RetVal, i) If Not (i = STILL_ACTIVE) Then Text1.SetWindowtext "フォームはありません!" Exit Do End If CallEvent Text1.SetWindowtext "フォームは存在します!" Loop End Sub '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub button1_on() Watch End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End