Private Sub Command1_Click() MsgBox IIf(Isrunexe("a.exe"), "运行中", "没运行") End SubPublic Function Isrunexe(ExeNm As String) As Boolean Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colProcesslist = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & ExeNm & "'") Isrunexe = IIf(colProcesslist.Count > 0, True, False) Set objWMIService = Nothing Set colProcesslist = Nothing End Function
可以用 FileSystemObject的fileexists() 也可以用 Dir$。
Option ExplicitPrivate Sub Command1_Click() MsgBox IIf(Isrunexe("a.exe"), "运行中", "没运行") End SubPublic Function Isrunexe(ExeNm As String) As Boolean Dim objWMIService As Object Dim colProcesslist As Object Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colProcesslist = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & ExeNm & "'") Isrunexe = IIf(colProcesslist.Count > 0, True, False) Set objWMIService = Nothing Set colProcesslist = Nothing End Function 经过测试上面的代码也可以,不知道楼主您是同意那种声明方法
'呵呵, 谢谢楼上提醒, "经过测试上面的代码也可以,不知道楼主您是同意那种声明方法"不用同不同意, 这是因我复制粘贴手上现成代码时, 忘了贴上通用区的宣告, 而这是 "必需" 加的.Option Explicit Dim objWMIService, colProcesslist Private Sub Command1_Click() MsgBox IIf(Isrunexe("a.exe"), "运行中", "没运行") End SubPublic Function Isrunexe(ExeNm As String) As Boolean Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2") Set colProcesslist = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & ExeNm & "'") Isrunexe = IIf(colProcesslist.Count > 0, True, False) Set objWMIService = Nothing Set colProcesslist = Nothing End Function
谢谢各位兄弟的回复,特别感谢cmb666提供的方法,简单好用。另外我还查到另一种用API的判断方法,也贴出来和兄弟们一块看看。 Private Const TH32CS_SNAPPROCESS = &H2 Private Const MAX_PATH As Integer = 260Public 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 * MAX_PATH End TypePrivate Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As LongPublic Function GetTargetProcessID(ByVal lpProcess As String) As Long Dim dwRet As Long Dim hSnapShot As Long Dim pe32 As PROCESSENTRY32
Do If InStr(pe32.szExeFile, lpProcess) > 0 Then dwRet = pe32.th32ProcessID Exit Do Else pe32.szExeFile = String(MAX_PATH, 0) End If Loop While (ProcessNext(hSnapShot, pe32))
CloseHandle (hSnapShot)
GetTargetProcessID = dwRet
End Function如果程序已经运行GetTargetProcessID返回程序的PID,否则返回0
MsgBox IIf(Isrunexe("a.exe"), "运行中", "没运行")
End SubPublic Function Isrunexe(ExeNm As String) As Boolean
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcesslist = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & ExeNm & "'")
Isrunexe = IIf(colProcesslist.Count > 0, True, False)
Set objWMIService = Nothing
Set colProcesslist = Nothing
End Function
也可以用 Dir$。
MsgBox IIf(Isrunexe("a.exe"), "运行中", "没运行")
End SubPublic Function Isrunexe(ExeNm As String) As Boolean
Dim objWMIService As Object
Dim colProcesslist As Object
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcesslist = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & ExeNm & "'")
Isrunexe = IIf(colProcesslist.Count > 0, True, False)
Set objWMIService = Nothing
Set colProcesslist = Nothing
End Function
经过测试上面的代码也可以,不知道楼主您是同意那种声明方法
"经过测试上面的代码也可以,不知道楼主您是同意那种声明方法"不用同不同意, 这是因我复制粘贴手上现成代码时, 忘了贴上通用区的宣告, 而这是 "必需" 加的.Option Explicit
Dim objWMIService, colProcesslist
Private Sub Command1_Click()
MsgBox IIf(Isrunexe("a.exe"), "运行中", "没运行")
End SubPublic Function Isrunexe(ExeNm As String) As Boolean
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcesslist = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & ExeNm & "'")
Isrunexe = IIf(colProcesslist.Count > 0, True, False)
Set objWMIService = Nothing
Set colProcesslist = Nothing
End Function
Private Const TH32CS_SNAPPROCESS = &H2
Private Const MAX_PATH As Integer = 260Public 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 * MAX_PATH
End TypePrivate Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As LongPublic Function GetTargetProcessID(ByVal lpProcess As String) As Long Dim dwRet As Long
Dim hSnapShot As Long
Dim pe32 As PROCESSENTRY32
hSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0)
pe32.dwSize = LenB(pe32)
ProcessFirst hSnapShot, pe32
Do
If InStr(pe32.szExeFile, lpProcess) > 0 Then
dwRet = pe32.th32ProcessID
Exit Do
Else
pe32.szExeFile = String(MAX_PATH, 0)
End If
Loop While (ProcessNext(hSnapShot, pe32))
CloseHandle (hSnapShot)
GetTargetProcessID = dwRet
End Function如果程序已经运行GetTargetProcessID返回程序的PID,否则返回0