在我的程序里启动第三方程序,如何先判断:如果已经在运行了,就不启动了。另外,按一个按钮,关掉这个程序。

解决方案 »

  1.   

    可以考虑使用内核对象"原子"
    GlobalAddAtom
    GlobalDeleteAtom
      

  2.   

    在程序启动时先检查进程,若已经启动,就干掉。
    Option ExplicitPrivate Const sEndProess As String = "explorer.exe" '资源管理器名称 必须小写
    Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
    Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
    Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
        
    Private Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long
        
    Private Type PROCESSENTRY32
                  dwSize     As Long
                  cntUsage     As Long
                  th32ProcessID     As Long
                  th32DefaultHeapID     As Long
                  th32ModuleID     As Long
                  cntThreads     As Long
                  th32ParentProcessID     As Long
                  pcPriClassBase     As Long
                  dwFlags     As Long
                  szExeFile     As String * 1024
    End Type
        
    Const TH32CS_SNAPHEAPLIST = &H1
    Const TH32CS_SNAPPROCESS = &H2
    Const TH32CS_SNAPTHREAD = &H4
    Const TH32CS_SNAPMODULE = &H8
    Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
    Const TH32CS_INHERIT = &H80000000
    Dim pid         As Long
    Dim pname         As String
        
    Private Sub Command1_Click()
            Call Form_Load
            'Shell "taskkill /im explorer.exe" '干掉资源管理器进程
    End SubPrivate Sub Command2_Click()
            Shell "c:\windows\explorer.exe", vbNormalFocus '启动资源管理器
    End SubPrivate Sub Form_Load()
          Dim my         As PROCESSENTRY32
          Dim l         As Long
          Dim l1         As Long
          Dim flag         As Boolean
          Dim mName         As String
          Dim i         As Integer
          
          Command1.Caption = "关闭资源管理器"
          Command2.Caption = "启动资源管理器"
          
          l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
          If l Then
             my.dwSize = 1060
             If (Process32First(l, my)) Then                 '遍历第一个进程
                Do
                   i = InStr(1, my.szExeFile, Chr(0))
                   mName = LCase(Left(my.szExeFile, i - 1))
                   If mName = LCase(sEndProess) Then
                      pid = my.th32ProcessID
                      pname = mName
                      Dim mProcID As Long
                      mProcID = OpenProcess(1&, -1&, pid)
                      TerminateProcess mProcID, 0&
                      flag = True
                      Exit Sub
                   Else
                      flag = False
                   End If
                Loop Until (Process32Next(l, my) < 1)   '遍历所有进程知道返回值为False
             End If
             l1 = CloseHandle(l)
          End If
          
    End Sub
      

  3.   

    以上Form_load中用TerminateProcess结束进程。 
      

  4.   

      '关闭打开的程序
                    Dim myprogramme As String = "CISQL013"
                    Dim myprocesses() As Process = Process.GetProcessesByName(myprogramme)
                    For Each myprocess As Process In myprocesses
                        myprocess.CloseMainWindow()
                        'MsgBox(" CLOSED")
                    Next轻松搞定