返回符合进程名称的所有进程PID

本文介绍了一个VBScript函数,用于根据进程名称获取对应的进程标识符(PID)。通过枚举所有活动进程,并利用Windows API函数,该函数能准确地找出并返回指定进程的PID。
'返回符合进程名称的所有进程PID
'
如果为没有,则返回空 (Empty)
Public Function GetProcessIdFromProcessName(ByVal strExeName As StringAs 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 400As 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 * 4As 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,欲关闭的一个对象的句柄
'
除非对内核对象的所有引用都已关闭,否则该对象不会实际删除

 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值