如系统已经启动了一个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
如何才能避免这种情况:即系统前面已经开启了aa.exe窗体,若再执行启动aa.exe命令,系统也不会重新启动同样的一个窗体.
本人采用的启动aa.exe窗体的代码如下:
Private Sub cdxj1_Click()
Shell "rundll32.exe url.dll,FileProtocolHandler " & App.Path & "\aa.exe", vbMaximizedFocus
End Sub
Private Sub Form_Load()
If App.PrevInstance Then
MsgBox "already "
End
End If
End Sub
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
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
CheckProcessExist的子程序函数未定义
应该修改成:
Public Function CheckProcessExist(ByVal EXEName As String) As Boolean
即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
有没有不用模块的办法?