用vb写了一个程序,生成可执行文件aaa.exe,运行后其标题为bbb。
现要写另一个程序,检测上面那个程序是否正在运行,目的:当上面的那个程序自动退出后重启该程序
(为什么要这样,别问)
请问能实现吗?怎么实现?感谢!

解决方案 »

  1.   

    可以在aaa.exe程序一开始时创建一个Metux,别的程序检测就行.
      

  2.   

    Option Explicit
    Public Declare Function Process32First Lib "kernel32" ( _
        ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
     Public Declare Function Process32Next Lib "kernel32" ( _
        ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
     Public Declare Function CloseHandle Lib "Kernel32.dll" _
        (ByVal Handle As Long) As Long
     Public Declare Function OpenProcess Lib "Kernel32.dll" _
       (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, _
           ByVal dwProcId As Long) As Long
     Public Declare Function EnumProcesses Lib "psapi.dll" _
        (ByRef lpidProcess As Long, ByVal cb As Long, _
           ByRef cbNeeded As Long) As Long
     Public Declare Function GetModuleFileNameExA Lib "psapi.dll" _
        (ByVal hProcess As Long, ByVal hModule As Long, _
           ByVal ModuleName As String, ByVal nSize As Long) As Long
     Public Declare Function EnumProcessModules Lib "psapi.dll" _
        (ByVal hProcess As Long, ByRef lphModule As Long, _
           ByVal cb As Long, ByRef cbNeeded As Long) As Long
     Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" ( _
        ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
     Public Declare Function GetVersionExA Lib "kernel32" _
        (lpVersionInformation As OSVERSIONINFO) As Integer
     Public Type PROCESSENTRY32
        dwSize As Long
        cntUsage As Long
        th32ProcessID As Long           ' This process
        th32DefaultHeapID As Long
        th32ModuleID As Long            ' Associated exe
        cntThreads As Long
        th32ParentProcessID As Long     ' This process's parent process
        pcPriClassBase As Long          ' Base priority of process threads
        dwFlags As Long
        szExeFile As String * 260       ' MAX_PATH
     End Type
     Public Type OSVERSIONINFO
        dwOSVersionInfoSize As Long
        dwMajorVersion As Long
        dwMinorVersion As Long
        dwBuildNumber As Long
        dwPlatformId As Long          '1 = Windows 95.
                                       '2 = Windows NT
        szCSDVersion As String * 128
     End Type
     Public Const PROCESS_QUERY_INFORMATION = 1024
     Public Const PROCESS_VM_READ = 16
     Public Const MAX_PATH = 260
     Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
     Public Const SYNCHRONIZE = &H100000
     'STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
     Public Const PROCESS_ALL_ACCESS = &H1F0FFF
     Public Const TH32CS_SNAPPROCESS = &H2&
     Public Const hNull = 0 Function StrZToStr(s As String) As String
        StrZToStr = Left$(s, Len(s) - 1)
     End Function Public Function getVersion() As Long
        Dim osinfo As OSVERSIONINFO
        Dim retvalue As Integer
        osinfo.dwOSVersionInfoSize = 148
        osinfo.szCSDVersion = Space$(128)
        retvalue = GetVersionExA(osinfo)
        getVersion = osinfo.dwPlatformId
     End Function窗体:一个listbox,一个按钮
    Option ExplicitPrivate Sub Command1_Click()
    List1.Clear
    Select Case getVersion()Case 1 'Windows 95/98   Dim f As Long, sname As String
       Dim hSnap As Long, proc As PROCESSENTRY32
       hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
       If hSnap = hNull Then Exit Sub
       proc.dwSize = Len(proc)
       ' Iterate through the processes
       f = Process32First(hSnap, proc)
       Do While f
         sname = StrZToStr(proc.szExeFile)
         List1.AddItem sname
         f = Process32Next(hSnap, proc)
       LoopCase 2 'Windows NT   Dim cb As Long
       Dim cbNeeded As Long
       Dim NumElements As Long
       Dim ProcessIDs() As Long
       Dim cbNeeded2 As Long
       Dim NumElements2 As Long
       Dim Modules(1 To 200) As Long
       Dim lRet As Long
       Dim ModuleName As String
       Dim nSize As Long
       Dim hProcess As Long
       Dim i As Long
       'Get the array containing the process id's for each process object
       cb = 8
       cbNeeded = 96
       Do While cb <= cbNeeded
          cb = cb * 2
          ReDim ProcessIDs(cb / 4) As Long
          lRet = EnumProcesses(ProcessIDs(1), cb, cbNeeded)
       Loop
       NumElements = cbNeeded / 4   For i = 1 To NumElements
          'Get a handle to the Process
          hProcess = OpenProcess(PROCESS_QUERY_INFORMATION _
             Or PROCESS_VM_READ, 0, ProcessIDs(i))
          'Got a Process handle
          If hProcess <> 0 Then
              'Get an array of the module handles for the specified
              'process
              lRet = EnumProcessModules(hProcess, Modules(1), 200, _
                                           cbNeeded2)
              'If the Module Array is retrieved, Get the ModuleFileName
              If lRet <> 0 Then
                 ModuleName = Space(MAX_PATH)
                 nSize = 500
                 lRet = GetModuleFileNameExA(hProcess, Modules(1), _
                                 ModuleName, nSize)
                 List1.AddItem Left(ModuleName, lRet)
              End If
          End If
        'Close the handle to the process
       lRet = CloseHandle(hProcess)
       NextEnd Select
    MsgBox IsRun("C:\WINDOWS\rUNDLL32.EXE")
    End SubPrivate Function IsRun(ByVal filename As String) As Boolean
        Dim i As Long
        IsRun = False
        For i = 1 To List1.ListCount
        Debug.Print List1.List(i)
            If List1.List(i) = UCase(filename) Then
            
                IsRun = True
                Exit Function
            End If
        NextEnd Function                     
      

  3.   

    Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Sub Form_Load()
        Dim I As Long
        
       I = FindWindow(vbNullString, "bbb")  '查找指定程序
        If I <> 0 Then END '如果有運行則關閉本程序
    End Sub
      

  4.   

    好像那个findwindow只可以用来找寻同一个vb程序不同窗体吧,好像外部的不行??
    谢!
      

  5.   

    看一个exe文件能否删除,不能删就是在运行
    Private Function CanDelete_V2(ByVal FQFilename$) As Boolean
    '看一个文件能否删除。能返回 true ,否返回false
    '注意这个函数不会删除文件
    ' 第 2版解决第 1 版与 word 的冲突问题
    On Error GoTo handler:
    Dim fn As Long
    fn = FreeFile '取得一个合法文件号
    Open FQFilename For Output Access Write As #fn '试着用写的方式打开文件,如果出错则说明文件是不可删的
    Close #fn '关闭文件
    CanDelete_V2 = True ' 说明文件可删
    Exit Function
    handler:
        CanDelete_V2 = False '如果出错则说明文件是不可删的
    End Function
      

  6.   

    谢谢各位不同的方法和建议!!!
    我自己在外面也刚看到一种方法,大家研究研究:
    (不过我自己觉得等待程序结束再响应,在任务管理器上显示“未响应”,这样好吗?
    还是没有影响呢?)------------------------------------
    Shell & Wait 的程序怎么写?  
    希望某一 VB 程序利用 Shell 执行某一个外部程序(假设是 notepad.exe)之后,就一直等到此一程序结束执行时, 才回到 VB 程序继续执行, 该怎么办到呢?当我们调用 Shell 时, 会传回一个数值, 此一数值称为 Process Id, 利用此一 Process Id, 我们可以调用 OpenProcess API 取得 Process Handle, 然后再利用 Process Handle 调用 WaitForSingleObject, 即可等待被 Shell 执行
    的 
    程序执行完毕, 才继续向下执行。细节如下: 
    1. API 的声明: 
    Const SYNCHRONIZE = &H100000 
    Const INFINITE = &HFFFFFFFF 
    Private Declare Function OpenProcess Lib "kernel32" (ByVal  
    dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcess
    Id  
    As Long) As Long 
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 
    Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal  
    hHandle As Long, ByVal dwMilliseconds As Long) As Long 
    注:如果以上的声明放在「一般模块」底下, 应将 Declare 之前的 Private 保留字去掉, 并且在 Const 之前加上 Public 保留字。 
    2. 程序范例:(以执行 Notepad 程序为例) 
    Dim pId As Long, pHnd As Long ' 分别声明 Process Id 及 Process Handle 
    变 
    数 
    pId = Shell("Notepad", vbNormalFocus) ' Shell 传回 Process Id 
    pHnd = OpenProcess(SYNCHRONIZE, 0, pId) ' 取得 Process Handle 
    If pHnd <> 0 Then 
    Call WaitForSingleObject(pHnd, INFINITE) ' 无限等待,直到程序结束 
    Call CloseHandle(pHnd) 
    End If
    -----------------------------------------