如系统已经启动了一个aa.exe窗体,现在又执行启动aa.exe窗体的一个命令后,任务栏上就出现了重复的两个aa窗体钮.
如何才能避免这种情况:即系统前面已经开启了aa.exe窗体,若再执行启动aa.exe命令,系统也不会重新启动同样的一个窗体.
本人采用的启动aa.exe窗体的代码如下:
Private Sub cdxj1_Click()
Shell "rundll32.exe url.dll,FileProtocolHandler " & App.Path & "\aa.exe", vbMaximizedFocus
End Sub

解决方案 »

  1.   

    试试这个
    Private Sub Form_Load()
        If App.PrevInstance Then
            MsgBox "already "
            End
        End If
    End Sub
      

  2.   

    Private Sub Form_Load()
    Call CheckExist(Me)  'CheckExist是自设的过程,用来判断程序有没有已经启动了
    End SubPublic Sub CheckExist(fm As Form)
    Dim title As String
    If App.PrevInstance Then
       title = App.title
       Call MsgBox("程序已执行", vbCritical)
       App.title = ""    
       fm.Caption = ""
       AppActivate title 
       End
    End If
    End Sub
      

  3.   

    新建一个模块, 将下面的代码粘贴进去:Option ExplicitPublic 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 LongPublic Const PROCESS_QUERY_INFORMATION = 1024
    Public Const PROCESS_VM_READ = 16
    Public Const MAX_PATH = 260Public Function CheckProcessesExist(ByVal EXEName As String) As Boolean
        Dim strProcessName As String
        Dim lngCBSize As Long
        Dim lngCBSizeReturned As Long
        Dim lngNumElements As Long
        Dim lngProcessIDs() As Long
        Dim lngCBSize2 As Long
        Dim lngModules(1 To 200) As Long
        Dim lngReturn As Long
        Dim strModuleName As String
        Dim lngSize As Long
        Dim lngHwndProcess As Long
        Dim lngLoop As Long
        Dim booResult As Boolean
        
        On Error GoTo Error_handler
        booResult = False
        EXEName = UCase(Trim(EXEName))
        lngCBSize = 8
        lngCBSizeReturned = 96
        Do While lngCBSize <= lngCBSizeReturned
            DoEvents
            lngCBSize = lngCBSize * 2
            ReDim lngProcessIDs(lngCBSize / 4) As Long
            lngReturn = EnumProcesses(lngProcessIDs(1), lngCBSize, lngCBSizeReturned)
        Loop
        lngNumElements = lngCBSizeReturned / 4
        For lngLoop = 1 To lngNumElements
            lngHwndProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lngProcessIDs(lngLoop))
            If lngHwndProcess <> 0 Then
                lngReturn = EnumProcessModules(lngHwndProcess, lngModules(1), 200, lngCBSize2)
                If lngReturn <> 0 Then
                    strModuleName = Space(MAX_PATH)
                    lngSize = 500
                    lngReturn = GetModuleFileNameExA(lngHwndProcess, lngModules(1), strModuleName, lngSize)
                    strProcessName = UCase(Trim(Left(strModuleName, lngReturn)))
                    If strProcessName = EXEName Then
                        booResult = True
                    End If
                End If
            End If
            lngReturn = CloseHandle(lngHwndProcess)
            DoEvents
            If booResult Then Exit For
        Next lngLoop
    Error_handler:
        Err.Clear
        CheckProcessesExist = booResult
    End Function
    原来的代码进行如下修改:Private Sub cdxj1_Click() 
      if not CheckProcessExist(App.Path & "\aa.exe") then
        Shell "rundll32.exe url.dll,FileProtocolHandler" & App.Path & "\aa.exe", vbMaximizedFocus 
      end if
    End   Sub
      

  4.   

    用楼上的办法,出现:
    CheckProcessExist的子程序函数未定义
      

  5.   

    Public Function CheckProcessesExist(ByVal EXEName As String) As Boolean
    应该修改成:
    Public Function CheckProcessExist(ByVal EXEName As String) As Boolean
      

  6.   

    在一个bb.exe文件通过了上述模块和代码,但从启动后的bb.exe文件中用下面代码,却无法打开aa.exe文件:
    即bb.exe用下面代码:
    Private Sub Command1_Click() Public   Function   CheckProcessExist(ByVal   EXEName   As   String)   As   Boolean 
    Shell "rundll32.exe url.dll,FileProtocolHandler " & App.Path & "\aa.exe", vbMaximizedFocus
     end if
    End Sub
    有没有不用模块的办法?