通过进程句柄hprocess获得pid

知道一个进程句柄,比如OpenProcess打开的句柄,想要得到这个进程的PID,可以使用一个XPSP1新增的API:

//输入hProcess,返回PID
Private Declare Function GetProcessId Lib "kernel32" (ByVal hProcess As Long) As Long

注意这个函数只能在XPSP1及以上系统中才可以使用

要增加通用性,可以使用NTDLL导出的NtQueryInformationProcess函数来完成:

'结构,常量及API声明
Private Const STATUS_SUCCESS As Long = &H0&
Private Type PROCESS_BASIC_INFORMATION
ExitStatus As Long
PebBaseAddress As Long
AffinityMask As Long
BasePriority As Long
UniqueProcessId As Long
InheritedFromUniqueProcessId As Long
End Type
Private Declare Function NtQueryInformationProcess Lib "ntdll" ( _
ByVal ProcessHandle As Long, _
ByVal ProcessInformationClass As Long, _
ByRef ProcessInformation As Any, _
ByVal lProcessInformationLength As Long, _
ByRef lReturnLength As Long) As Long

使用示例:

Dim PBI As PROCESS_BASIC_INFORMATION
If STATUS_SUCCESS = NtQueryInformationProcess(hProcess, 0, PBI, Len(PBI), ByVal 0) Then
MsgBox PBI.UniqueProcessId 'UniqueProcessId就是PID
End If