'返回符合进程名称的所有进程PID
'如果为没有,则返回空 (Empty)
Public Function GetProcessIdFromProcessName(ByVal strExeName As String) As Long
On Error Resume Next
Const clMaxNumProcesses As Long = 5000 '最大进程数
Const MAX_PATH = 260
Const PROCESS_QUERY_INFORMATION = 1024
Const PROCESS_VM_READ = 16
Dim strModuleName As String * MAX_PATH
Dim strProcessNamePath As String
Dim strProcessName As String
Dim allMatchingProcessIDs() As Long
Dim alModules(1 To 400) As Long
Dim lBytesReturned As Long
Dim lNumMatching As Long
Dim lNumProcesses As Long
Dim lBytesNeeded As Long
Dim alProcIDs() As Long
Dim lHwndProcess As Long
Dim lThisProcess As Long
Dim lRet As Long
On Error GoTo Z
strExeName = UCase$(Trim$(strExeName))
ReDim alProcIDs(clMaxNumProcesses * 4) As Long '??5000*4
lRet = EnumProcesses(alProcIDs(1), clMaxNumProcesses * 4, lBytesReturned)
lNumProcesses = lBytesReturned / 4
ReDim Preserve alProcIDs(lNumProcesses) '获取所有进程的标识符,学号嘛
' Dim i As Integer
' For i = 1 To lNumProcesses
' Debug.Print alProcIDs(i)
' Next i
ReDim allMatchingProcessIDs(1 To lNumProcesses)
For lThisProcess = 1 To lNumProcesses 'lNumProcesses=现在进程数
If lHwndProcess > 0 Then lRet = CloseHandle(lHwndProcess)
lHwndProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, alProcIDs(lThisProcess))
If lHwndProcess <> 0 Then
lRet = EnumProcessModules(lHwndProcess, alModules(1), 200&, lBytesNeeded)
If lRet <> 0 Then
lRet = GetModuleFileNameExA(lHwndProcess, alModules(1), strModuleName, MAX_PATH)
strProcessNamePath = Trim$(UCase$(Left$(strModuleName, lRet)))
strProcessName = Mid$(strProcessNamePath, InStrRev(strProcessNamePath, "") + 1)
If strProcessName = strExeName Then
lNumMatching = lNumMatching + 1
allMatchingProcessIDs(lNumMatching) = alProcIDs(lThisProcess)
End If
End If
If lHwndProcess > 0 Then lRet = CloseHandle(lHwndProcess)
End If
Next
If lNumMatching Then
ReDim Preserve allMatchingProcessIDs(1 To lNumMatching)
GetProcessIdFromProcessName = allMatchingProcessIDs(1) '这个地方,不知道是否还有其它的值。
Else
GetProcessIdFromProcessName = -1
End If
Exit Function
Z:
GetProcessIdFromProcessName = -1
End Function
Private Sub Form_Load()
Dim Pid As Long
Pid = GetProcessIdFromProcessName("notepad.exe") '获取QQ程序的PID
Debug.Print (Pid) '>0 表示找到了,否则,就是没有找到。
'pid就是进程的标识符
End Sub
'所用的API说明:
'OpenProcess
'打开一个现有进程的句柄
'参数表
'dwDesiredAccess Long,指定这个句柄要求的访问方法。指定API32.TXT文件中以PROCESS_???开头的一个或多个常数
'bInheritHandle Long,如句柄能够由子进程继承,则为TRUE
'dwProcessId Long,要打开那个进程的进程标识符
'这个函数经常用来打开一个要进行同步的进程
'CloseHandle
'关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。
'涉及文件处理时,这个函数通常与vb的close命令相似。应尽可能的使用close,因为它支持vb的差错控制。
'注意这个函数使用的文件句柄与vb的文件编号是完全不同的
'参数表
'hObject Long,欲关闭的一个对象的句柄
'除非对内核对象的所有引用都已关闭,否则该对象不会实际删除
'如果为没有,则返回空 (Empty)
Public Function GetProcessIdFromProcessName(ByVal strExeName As String) As Long
On Error Resume Next
Const clMaxNumProcesses As Long = 5000 '最大进程数
Const MAX_PATH = 260
Const PROCESS_QUERY_INFORMATION = 1024
Const PROCESS_VM_READ = 16
Dim strModuleName As String * MAX_PATH
Dim strProcessNamePath As String
Dim strProcessName As String
Dim allMatchingProcessIDs() As Long
Dim alModules(1 To 400) As Long
Dim lBytesReturned As Long
Dim lNumMatching As Long
Dim lNumProcesses As Long
Dim lBytesNeeded As Long
Dim alProcIDs() As Long
Dim lHwndProcess As Long
Dim lThisProcess As Long
Dim lRet As Long
On Error GoTo Z
strExeName = UCase$(Trim$(strExeName))
ReDim alProcIDs(clMaxNumProcesses * 4) As Long '??5000*4
lRet = EnumProcesses(alProcIDs(1), clMaxNumProcesses * 4, lBytesReturned)
lNumProcesses = lBytesReturned / 4
ReDim Preserve alProcIDs(lNumProcesses) '获取所有进程的标识符,学号嘛
' Dim i As Integer
' For i = 1 To lNumProcesses
' Debug.Print alProcIDs(i)
' Next i
ReDim allMatchingProcessIDs(1 To lNumProcesses)
For lThisProcess = 1 To lNumProcesses 'lNumProcesses=现在进程数
If lHwndProcess > 0 Then lRet = CloseHandle(lHwndProcess)
lHwndProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, alProcIDs(lThisProcess))
If lHwndProcess <> 0 Then
lRet = EnumProcessModules(lHwndProcess, alModules(1), 200&, lBytesNeeded)
If lRet <> 0 Then
lRet = GetModuleFileNameExA(lHwndProcess, alModules(1), strModuleName, MAX_PATH)
strProcessNamePath = Trim$(UCase$(Left$(strModuleName, lRet)))
strProcessName = Mid$(strProcessNamePath, InStrRev(strProcessNamePath, "") + 1)
If strProcessName = strExeName Then
lNumMatching = lNumMatching + 1
allMatchingProcessIDs(lNumMatching) = alProcIDs(lThisProcess)
End If
End If
If lHwndProcess > 0 Then lRet = CloseHandle(lHwndProcess)
End If
Next
If lNumMatching Then
ReDim Preserve allMatchingProcessIDs(1 To lNumMatching)
GetProcessIdFromProcessName = allMatchingProcessIDs(1) '这个地方,不知道是否还有其它的值。
Else
GetProcessIdFromProcessName = -1
End If
Exit Function
Z:
GetProcessIdFromProcessName = -1
End Function
Private Sub Form_Load()
Dim Pid As Long
Pid = GetProcessIdFromProcessName("notepad.exe") '获取QQ程序的PID
Debug.Print (Pid) '>0 表示找到了,否则,就是没有找到。
'pid就是进程的标识符
End Sub
'所用的API说明:
'OpenProcess
'打开一个现有进程的句柄
'参数表
'dwDesiredAccess Long,指定这个句柄要求的访问方法。指定API32.TXT文件中以PROCESS_???开头的一个或多个常数
'bInheritHandle Long,如句柄能够由子进程继承,则为TRUE
'dwProcessId Long,要打开那个进程的进程标识符
'这个函数经常用来打开一个要进行同步的进程
'CloseHandle
'关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。
'涉及文件处理时,这个函数通常与vb的close命令相似。应尽可能的使用close,因为它支持vb的差错控制。
'注意这个函数使用的文件句柄与vb的文件编号是完全不同的
'参数表
'hObject Long,欲关闭的一个对象的句柄
'除非对内核对象的所有引用都已关闭,否则该对象不会实际删除