主题:如何通过进程的PID,获知该进程何时运行结束???
windows professional 2000, visual basic 6.0
在VB中通过一个shell调用启动了另外一个应用程序
代码如下:
pID = Shell(App.Path & "\ABC.exe", vbNormalFocus)
通过shell调用启动ABC.exe,返回该程序的进程号。我需要在VB中等待该程序运行结束后才能进行下面的操作。但是这个ABC.exe运行的时候不象cacu.exe那种窗口,它会打开一个类似于DOS的窗口,运行的时候输出一些字符信息,运行结束后窗口会自动关闭。
我在VB中可以获得这个程序的pID,但是如何才能通过该pID号监测该程序何时运行结束呢?
我尝试了一些办法
运用win32api OpenProcess WaitForSingleObject FindWindow GetClassName等等
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long '等待shell结束
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
尝试过以下一些方法
程序中代码如下:
1.pHnd = OpenProcess(SYNCHRONIZE, 0, pID) ' 取得 Process Handle
If pHnd <> 0 Then
Call WaitForSingleObject(pHnd, INFINITE) ' 等待程序结束
Call CloseHandle(pHnd)
End If
2.WindowStr = App.Path & "\ABC.exe"
While FindWindow(0&, WindowStr) <> Null
DoEvents
Wend
3.Function IsRunning(ByVal ProgramID) As Boolean ' 传入进程标识ID
Dim hProgram As Long '被检测的程序进程句柄
hProgram = OpenProcess(0, False, ProgramID)
If Not hProgram = 0 Then
IsRunning = True
Else
IsRunning = False
End If
CloseHandle hProgram
End Function
但是仍然不能解决
现象是:可以获得pID号,但是无法获得Hwnd,
无法捕获类似于这种DOS窗口的句柄,
还有就是可以启动ABC.exe,但是VB不等待就接着执行下面的代码了...
请问该如何解决,能给点思路也行
谢谢
谢谢
QQ:81252178
在VB中通过一个shell调用启动了另外一个应用程序
代码如下:
pID = Shell(App.Path & "\ABC.exe", vbNormalFocus)
通过shell调用启动ABC.exe,返回该程序的进程号。我需要在VB中等待该程序运行结束后才能进行下面的操作。但是这个ABC.exe运行的时候不象cacu.exe那种窗口,它会打开一个类似于DOS的窗口,运行的时候输出一些字符信息,运行结束后窗口会自动关闭。
我在VB中可以获得这个程序的pID,但是如何才能通过该pID号监测该程序何时运行结束呢?
我尝试了一些办法
运用win32api OpenProcess WaitForSingleObject FindWindow GetClassName等等
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long '等待shell结束
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
尝试过以下一些方法
程序中代码如下:
1.pHnd = OpenProcess(SYNCHRONIZE, 0, pID) ' 取得 Process Handle
If pHnd <> 0 Then
Call WaitForSingleObject(pHnd, INFINITE) ' 等待程序结束
Call CloseHandle(pHnd)
End If
2.WindowStr = App.Path & "\ABC.exe"
While FindWindow(0&, WindowStr) <> Null
DoEvents
Wend
3.Function IsRunning(ByVal ProgramID) As Boolean ' 传入进程标识ID
Dim hProgram As Long '被检测的程序进程句柄
hProgram = OpenProcess(0, False, ProgramID)
If Not hProgram = 0 Then
IsRunning = True
Else
IsRunning = False
End If
CloseHandle hProgram
End Function
但是仍然不能解决
现象是:可以获得pID号,但是无法获得Hwnd,
无法捕获类似于这种DOS窗口的句柄,
还有就是可以启动ABC.exe,但是VB不等待就接着执行下面的代码了...
请问该如何解决,能给点思路也行
谢谢
谢谢
QQ:81252178