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

' 返回符合进程名称的所有进程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,欲关闭的一个对象的句柄
'
除非对内核对象的所有引用都已关闭,否则该对象不会实际删除

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值