不错,用数组存放是个好办法,不会出现改值的问题,这是我修改后的代码:
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetProcessIoCounters Lib "kernel32" (ByVal hProcess As Long, lpIoCounters As IO_COUNTERS) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "Advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private 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 * 1024
End Type
Private Type IO_COUNTERS
ReadOperationCount As Long
WriteOperationCount As Long
OtherOperationCount As Long
ReadTransferCount As Long
WriteTransferCount As Long
OtherTransferCount As Long
End Type
Private Type LUID
UsedPart As Long
IgnoredForNowHigh32BitPart As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
TheLuid As LUID
Attributes As Long
End Type
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
'///OpenProcess的常量
Const STANDARD_RIGHTS_REQUIRED = &HF0000
Const SYNCHRONIZE = &H100000
Const PROCESS_TERMINATE = &H1& ' Used to kill a process
Const PROCESS_CREATE_THREAD = &H2&
Const PROCESS_VM_OPERATION = &H8&
Const PROCESS_VM_READ = &H10&
Const PROCESS_VM_WRITE = &H206
Const PROCESS_DUP_HANDLE = &H40&
Const PROCESS_CREATE_PROCESS = &H80&
Const PROCESS_SET_QUOTA = &H100&
Const PROCESS_SET_INFORMATION = &H200& ' Used to set information on a process (like priority)
Const PROCESS_QUERY_INFORMATION = &H400&
Const PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)
'得到进程填充listview
Private Sub AdjustToken()
Dim lngTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpTemp As TOKEN_PRIVILEGES
OpenProcessToken GetCurrentProcess(), (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), lngTokenHandle
LookupPrivilegeValue "", "SeDebugPrivilege", tmpLuid
tkp.PrivilegeCount = 1
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED
AdjustTokenPrivileges lngTokenHandle, False, tkp, Len(tkpTemp), tkpTemp, 0
End Sub
Private Sub Command1_Click()
Dim my As PROCESSENTRY32
Dim ioc As IO_COUNTERS
Dim jj As Long
Dim l As Long
Dim l1 As Long
Dim mlistitem As ListItem
ListView1.ListItems.Clear
' List1.Clear
l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If l Then
my.dwSize = Len(my)
Dim temp(50) As Long
Dim i As Integer
i = 0
If (Process32First(l, my)) Then '遍历第一个进程
Do
temp(i) = my.th32ProcessID
i = i + 1
Loop Until (Process32Next(l, my) = 0) '遍历所有进程知道返回值为False
End If
Dim k As Integer
For k = 0 To i - 1
Set mlistitem = ListView1.ListItems.Add(, , temp(k))
jj = OpenProcess(PROCESS_ALL_ACCESS, 0, temp(k)) '返回进程句柄
GetProcessIoCounters jj, ioc
mlistitem.SubItems(3) = ioc.ReadOperationCount '进程的 I/O 读取
mlistitem.SubItems(4) = ioc.OtherOperationCount '进程的 I/O 写入
CloseHandle (jj)
Next
l1 = CloseHandle(l)
End If
End Sub
Private Sub Form_Load()
Call AdjustToken
ListView1.ListItems.Clear
ListView1.FullRowSelect = True
ListView1.View = lvwReport
End Sub
homezj 提到的一些错误,我已经改正,只是后面那句 my.dwSize= Len(my) 不能去掉,正如bdhh(Silent)所说的那样。去了就只能列举到几个进程。
我的函数声明如下,可以看下有没问题:
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetProcessIoCounters Lib "kernel32" (ByVal hProcess As Long, lpIoCounters As IO_COUNTERS) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "Advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
感谢大家!我把分数加到100
我按照 bdhh(Silent) 的方法做了,可是没效果,数值都是0呢。麻烦再看看,是什么原因
'函数声明
.....
Private Sub AdjustToken()
Dim lngTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpTemp As TOKEN_PRIVILEGES
tkp.PrivilegeCount = 1
tkp.TheLuid = tmpLuid
tkp.Attributes = SE_PRIVILEGE_ENABLED
OpenProcessToken GetCurrentProcess(), (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), lngTokenHandle
LookupPrivilegeValue "", "SeDebugPrivilege", tmpLuid
AdjustTokenPrivileges lngTokenHandle, False, tkp, Len(tkpTemp), tkpTemp, 0
End Sub
Private Sub Command1_Click()
Dim my As PROCESSENTRY32
Dim ioc As IO_COUNTERS
Dim jj As Long
Dim l As Long
Dim l1 As Long
Dim mlistitem As ListItem
ListView1.ListItems.Clear
' List1.Clear
l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If l Then
my.dwSize = 1060
If (Process32First(l, my)) Then '遍历第一个进程
Do
Call AdjustToken
Set mlistitem = ListView1.ListItems.Add(, , my.th32ProcessID)
mlistitem.SubItems(1) = my.th32ParentProcessID
mlistitem.SubItems(2) = my.szExeFile
jj = OpenProcess(PROCESS_ALL_ACCESS, 0, my.th32ProcessID) '返回进程句柄
GetProcessIoCounters jj, ioc
mlistitem.SubItems(3) = ioc.ReadOperationCount '进程的 I/O 读取
mlistitem.SubItems(4) = ioc.OtherOperationCount '进程的 I/O 写入
CloseHandle (jj)
my.dwSize = Len(my)
Loop Until (Process32Next(l, my) < 1) '遍历所有进程知道返回值为False
End If
l1 = CloseHandle(l)
End If
End Sub
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function GetProcessIoCounters Lib "kernel32" (ByVal hProcess As Long, lpIoCounters As IO_COUNTERS) As Long
Private 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 * 1024
End Type
Private Type IO_COUNTERS
ReadOperationCount As Long
WriteOperationCount As Long
OtherOperationCount As Long
ReadTransferCount As Long
WriteTransferCount As Long
OtherTransferCount As Long
End Type
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
'///OpenProcess的常量
Const STANDARD_RIGHTS_REQUIRED = &HF0000
Const SYNCHRONIZE = &H100000
Const PROCESS_TERMINATE = &H1& ' Used to kill a process
Const PROCESS_CREATE_THREAD = &H2&
Const PROCESS_VM_OPERATION = &H8&
Const PROCESS_VM_READ = &H10&
Const PROCESS_VM_WRITE = &H206
Const PROCESS_DUP_HANDLE = &H40&
Const PROCESS_CREATE_PROCESS = &H80&
Const PROCESS_SET_QUOTA = &H100&
Const PROCESS_SET_INFORMATION = &H200& ' Used to set information on a process (like priority)
Const PROCESS_QUERY_INFORMATION = &H400&
Const PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)
'得到进程填充listview
Private Sub Command1_Click()
Dim my As PROCESSENTRY32
Dim ioc As IO_COUNTERS
Dim jj As Long
Dim l As Long
Dim l1 As Long
Dim mlistitem As ListItem
ListView1.ListItems.Clear
' List1.Clear
l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If l Then
my.dwSize = 1060
If (Process32First(l, my)) Then '遍历第一个进程
Do
Set mlistitem = ListView1.ListItems.Add(, , my.th32ProcessID)