回 帖 发 新 帖 刷新版面

主题:如何通过进程的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

回复列表 (共1个回复)

沙发

最简单的办法...vb里加个时钟控件...不断检查是不是还存在 这个进程....即可...

还有就是你用OpenProcess(0, False, ProgramID)函数的时候,应该没有提升权限(nt以上操作系统都需要)所以调用都失败...

我来回复

您尚未登录,请登录后再回复。点此登录或注册