如果你不调用win32 api的话,可以使用一个巧妙的办法绕过去。让你的程序定时(我定的是每隔100毫秒)去访问一个文件(生命文件),保证里面只有一行:running=1。该程序启动时,就访问这个文件,写入:running=0(先晴空文件)。然后过一段时间(我定的是1秒,使用timer控件),检查,如果变成了running=1,表明有一个历程在运行,就退出,否则,就进入,并且开始维持这个文件的状态。如此不会有两个程序同时运行。(注意,写完了文件要释放)这个方法怎么样?(进程管理的土办法)。打开应用程序可以使用shell命令,中断就调api吧

解决方案 »

  1.   

    防止一个应用程序被打开两次,你就必须在VB中打开应用程序的前,把所有的进程都enum出来然后判断新把的程序是不是已经打开?
    关于enum所有进程的代码如下:
    <<<<<<<<<<<<<<<<<<<<< Form >>>>>>>>>>>>>>>>>>>>>>>      Option Explicit      Private 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)
             Loop      Case 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)
             Next      End Select
          End Sub
    <<<<<<<<<<<<<<<Module>>>>>>>>>>>>>>>>>>>>
    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想中断某个程序
    就可以找到某个程序的hProcess,调用TerminateProcess就可以了打开某个程序
    直接用Shell函数
      

  2.   

    在VB中防止一个应用程序被打开两次:
    Private Sub Form_Load()
        If App.PrevInstance = True Then
           Call MsgBox("这个程序正在运行。",, vbExclamation)
           End
        End If
    End Sub想中断某个程序:
    发信给我,我给你一份源代码。 [email protected]打开某个程序用Shell函数
      

  3.   

    还有个办法,在Form_Load中用FindWindow这个API函数,如果找到了就Unload