起動させたアプリケーションの終了を知る(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