コマンドプロントの終了プロセスを検知するには?

解決


満月の夜  2008-02-27 11:54:03  No: 139091  IP: 192.*.*.*

題記の件につきまして、現在困っています.
コマンドプロントアプリケーションを右上のXで終了した際、作成したVBアプリケーションで検知する方法を探しています.
ご教授願えれば幸いです。よろしくお願いします。
環境:VB6.0(SP5) Windouws2000

編集 削除
いな  2008-02-27 13:15:38  No: 139092  IP: 192.*.*.*

例えば・・・。

http://hanatyan.sakura.ne.jp/vbhlp/tap_PrgEnd.htm

とか?

編集 削除
満月の夜  2008-02-27 13:57:53  No: 139093  IP: 192.*.*.*

いな様  ありがとうございます。
お教え頂いたサイトを元に実行したところ、目的の事ができました.

しかし手動もしくは他のアプリケーション(C++等)でコマンドプロントを立ち上げてXボタンにて終了したときは、VBのアプリケーションで検知できませんでした.
同様に検知したいときはどのようにしたらいいでしょうか?
大変申し訳ありませんが、ご教授のほどよろしくお願いします.

編集 削除
満月の夜  2008-02-28 10:15:40  No: 139094  IP: 192.*.*.*

DOS窓を他のアプリケーションから立ち上げる→Xボタンで終了したときは、他のVBアプリケーションでは検知できないのでしょうか?
DOS窓をフックするような形で実行してもできませんでした(私のやり方がまずいかも・・・)
検知方法がまだわかりません。どなたかわかる方お教え願えれば幸いです.

編集 削除
いな  2008-02-28 10:39:22  No: 139095  IP: 192.*.*.*

昨日は午後からずっと打合せで、レスを見ることができませんでした。

EnumWindowsでウィンドウハンドルを列挙し、
列挙されたハンドルを使ってGetWindowThreadProcessIdで
スレッドIDとプロセスIDを取得してみるとか

編集 削除
満月の夜  2008-02-28 14:26:35  No: 139096  IP: 192.*.*.*

いな様

お忙しい所、何度も教えて頂きありがとうございます.
いな様のアドバイスから、ウィンドウネイム,IDを取得して監視できるようになりました.(ソースがもしおかしければお教え願いします.とりあえず目的は達成できました.)
本当にありがとうございました。

’<グーバル宣言>
Option Explicit
'---------------------------------------------
' API宣言
'---------------------------------------------
Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function GetWindowPlacement Lib "user32" (ByVal hWnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
Public Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long

'---------------------------------------------
' GetWindowで使用する定数
'---------------------------------------------
Public Const GW_OWNER = 4

'---------------------------------------------
' GetWindowPlacementで使用する構造体
'---------------------------------------------
Public Type POINTAPI
        x As Long
        y As Long
End Type

Public Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type

Public Type WINDOWPLACEMENT
        Length As Long
        flags As Long
        showCmd As Long
        ptMinPosition As POINTAPI
        ptMaxPosition As POINTAPI
        rcNormalPosition As RECT
End Type

'---------------------------------------------
' コールバック関数
'---------------------------------------------
Public Function EnumWndProc(ByVal hWnd As Long, lParam As Long) As Boolean
Dim strWindowName As String * 128
Dim strClassName As String * 128
Dim WPL As WINDOWPLACEMENT
Dim lngRet As Long
    
    '---------------------------------------------
    ' 初期化
    '---------------------------------------------
    strWindowName = ""
    strClassName = ""
    
    '---------------------------------------------
    ' ウィンドウのタイトルを表示する
    '---------------------------------------------
    lngRet = GetWindowText(hWnd, strWindowName, Len(strWindowName))
    Call GetClassName(hWnd, strClassName, Len(strClassName))
    
    If IsWindowVisible(hWnd) Then
       If GetWindow(hWnd, GW_OWNER) = 0 Then
          If lngRet <> 0 Then
            If Left(strClassName, 7) <> "Progman" Then
               WPL.Length = Len(WPL)
               Call GetWindowPlacement(hWnd, WPL)
               
'---------------------------------------------
' デバックで出力
'---------------------------------------------
Debug.Print "----------------------------------"
Debug.Print "hWnd        = " & hWnd
Debug.Print "Window Name = " & strWindowName
Debug.Print "Class  Name = " & strClassName
Debug.Print "Left        = " & WPL.rcNormalPosition.Left
Debug.Print "Top         = " & WPL.rcNormalPosition.Top
Debug.Print "Right       = " & WPL.rcNormalPosition.Right
Debug.Print "Bottm       = " & WPL.rcNormalPosition.Bottom
'---------------------------------------------
' デバックで出力
'---------------------------------------------
            End If
          End If
      End If
    End If
    EnumWndProc = True
End Function


’<フォームローカル>
Option Explicit

Private Sub Command1_Click()
    Call EnumWindows(AddressOf EnumWndProc, 0)

End Sub

編集 削除
満月の夜  2008-02-28 14:27:33  No: 139097  IP: 192.*.*.*

解決チェックをつけ忘れていました。
納得の解決チェックを付けさせて頂きます.
ありがとうございました.

編集 削除