我将代码抄给你吧:FrmMainOption Explicit '******************************************************************************** '* CPUUsage 1.0 '* ---------------- '* '* This program is total FREEWARE. '* '* It use the registry to get the CPU usage in percent. '* '* You can also move the form without title bar and close it with the right button. '* '* Happy programming ! '* '* '********************************************************************************' The CPUUsage object Private CPU As New CPUUsage Private Avg As Long ' Average of CPU Usage Private Sum As Long Private Index As LongPrivate Sub Form_Load() ' First, open the "StartStat" key CPU.InitCPUUsage End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Timer.Enabled = False Set CPU = Nothing Cancel = 0 End SubPrivate Sub Frame1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Call Form_MouseDown(Button, Shift, X, Y) End SubPrivate Sub pctPrg_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = 2 Then Unload Me End End If Call Form_MouseDown(Button, Shift, X, Y) End SubPrivate Sub Timer_Timer() 'Get the CPU Usage every second Dim tmp As Long tmp = CPU.GetCPUUsage Sum = Sum + tmp Index = Index + 1 Avg = Int(Sum / Index) 'Draw the bar pctPrg.Cls pctPrg.Line (0, 0)-(tmp, 18), , BF pctPrg.Line (Avg, 0)-(Avg, 18), &HFF pctPrg.Line (Avg + 1, 0)-(Avg + 1, 18), &HFF End SubPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim rc As Long rc = ReleaseCapture rc = SendMessage(hwnd, WM_NCLBUTTONDOWN, LP_HT_CAPTION, ByVal 0&) End SubMudula ApiOption Explicit 'Const&Functions used for the FormMove methods Public Const LP_HT_CAPTION = 2 Public Const WM_NCLBUTTONDOWN = &HA1Declare Function ReleaseCapture Lib "user32" () As Long Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Longcls:CPUUsageOption ExplicitPrivate Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long Private Const REG_DWORD = 4 Private Const HKEY_DYN_DATA = &H80000006 'Initiate the key Public Sub InitCPUUsage() Dim Data As Long, Typ As Long, Size As Long Dim hKey As Long, hRet As Long hRet = RegOpenKey(HKEY_DYN_DATA, "PerfStats\StartStat", hKey) hRet = RegQueryValueEx(hKey, "KERNEL\CPUUsage", 0, REG_DWORD, Data, 4) hRet = RegCloseKey(hKey) End Sub 'Get the cpu info via gfx meter Public Function GetCPUUsage() As Long Dim Data As Long, Typ As Long, Size As Long Dim hKey As Long Dim hRet As Long hRet = RegOpenKey(HKEY_DYN_DATA, "PerfStats\StatData", hKey) hRet = RegQueryValueEx(hKey, "KERNEL\CPUUsage", 0&, REG_DWORD, Data, 4) GetCPUUsage = Data hRet = RegCloseKey(hKey) End Function
谁能将下面的自定义结构和api说明翻成VB的,多谢! typedef struct { DWORD dwUnknown1; ULONG uKeMaximumIncrement; ULONG uPageSize; ULONG uMmNumberOfPhysicalPages; ULONG uMmLowestPhysicalPage; ULONG uMmHighestPhysicalPage; ULONG uAllocationGranularity; PVOID pLowestUserAddress; PVOID pMmHighestUserAddress; ULONG uKeActiveProcessors; BYTE bKeNumberProcessors; BYTE bUnknown2; WORD wUnknown3; } SYSTEM_BASIC_INFORMATION;typedef struct { LARGE_INTEGER liIdleTime; DWORD dwSpare[76]; } SYSTEM_PERFORMANCE_INFORMATION;typedef struct { LARGE_INTEGER liKeBootTime; LARGE_INTEGER liKeSystemTime; LARGE_INTEGER liExpTimeZoneBias; ULONG uCurrentTimeZoneId; DWORD dwReserved; } SYSTEM_TIME_INFORMATION;// NtQuerySystemInformation( // IN UINT SystemInformationClass, // information type // OUT PVOID SystemInformation, // pointer to buffer // IN ULONG SystemInformationLength, // buffer size in bytes // OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit
type SYSTEM_BASIC_INFORMATION dwUnknown1 as long uKeMaximumIncrement as long uPageSize as long uMmNumberOfPhysicalPages as long uMmLowestPhysicalPage as long uMmHighestPhysicalPage as long uAllocationGranularity as long pLowestUserAddress as long pMmHighestUserAddress as long uKeActiveProcessors as long bKeNumberProcessors as byte bUnknown2 as byte wUnknown3 as long End Typetype SYSTEM_PERFORMANCE_INFORMATION liIdleTime as LARGE_INTEGER dwSpare(76) as long End Typetype SYSTEM_TIME_INFORMATION liKeBootTime as LARGE_INTEGER liKeSystemTime as LARGE_INTEGER liExpTimeZoneBias as LARGE_INTEGER; uCurrentTimeZoneId as long dwReserved as long end typeDeclare sub NtQuerySystemInformation lib "NtDll.dll"(SystemInformationClass as long, _ SystemInformation as long, _ SystemInformationLength as long, _ Byval SystemInformationLength as long, _ OPTIONAL ReturnLength as long)
'********************************************************************************
'* CPUUsage 1.0
'* ----------------
'*
'* This program is total FREEWARE.
'*
'* It use the registry to get the CPU usage in percent.
'*
'* You can also move the form without title bar and close it with the right button.
'*
'* Happy programming !
'*
'*
'********************************************************************************' The CPUUsage object
Private CPU As New CPUUsage
Private Avg As Long ' Average of CPU Usage
Private Sum As Long
Private Index As LongPrivate Sub Form_Load()
' First, open the "StartStat" key
CPU.InitCPUUsage
End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Timer.Enabled = False
Set CPU = Nothing
Cancel = 0
End SubPrivate Sub Frame1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Call Form_MouseDown(Button, Shift, X, Y)
End SubPrivate Sub pctPrg_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 2 Then
Unload Me
End
End If
Call Form_MouseDown(Button, Shift, X, Y)
End SubPrivate Sub Timer_Timer()
'Get the CPU Usage every second
Dim tmp As Long
tmp = CPU.GetCPUUsage
Sum = Sum + tmp
Index = Index + 1
Avg = Int(Sum / Index)
'Draw the bar
pctPrg.Cls
pctPrg.Line (0, 0)-(tmp, 18), , BF
pctPrg.Line (Avg, 0)-(Avg, 18), &HFF
pctPrg.Line (Avg + 1, 0)-(Avg + 1, 18), &HFF
End SubPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim rc As Long
rc = ReleaseCapture
rc = SendMessage(hwnd, WM_NCLBUTTONDOWN, LP_HT_CAPTION, ByVal 0&)
End SubMudula ApiOption Explicit
'Const&Functions used for the FormMove methods
Public Const LP_HT_CAPTION = 2
Public Const WM_NCLBUTTONDOWN = &HA1Declare Function ReleaseCapture Lib "user32" () As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Longcls:CPUUsageOption ExplicitPrivate Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Const REG_DWORD = 4
Private Const HKEY_DYN_DATA = &H80000006
'Initiate the key
Public Sub InitCPUUsage()
Dim Data As Long, Typ As Long, Size As Long
Dim hKey As Long, hRet As Long hRet = RegOpenKey(HKEY_DYN_DATA, "PerfStats\StartStat", hKey)
hRet = RegQueryValueEx(hKey, "KERNEL\CPUUsage", 0, REG_DWORD, Data, 4)
hRet = RegCloseKey(hKey)
End Sub
'Get the cpu info via gfx meter
Public Function GetCPUUsage() As Long
Dim Data As Long, Typ As Long, Size As Long
Dim hKey As Long
Dim hRet As Long hRet = RegOpenKey(HKEY_DYN_DATA, "PerfStats\StatData", hKey)
hRet = RegQueryValueEx(hKey, "KERNEL\CPUUsage", 0&, REG_DWORD, Data, 4)
GetCPUUsage = Data
hRet = RegCloseKey(hKey)
End Function
这个实在注册表里面去的数值的呀! 我记得 奥莱里 出的一本书里面,可以判断每一个进程占用的cpu时钟比例 但是源代码要配套光盘里面才有,
我这本书是解图书馆的,没有馆盘
我找到一个用c++的办法,帮你转成vb的,你等着,估计明早就行了
那个c++的例子是用sdk写的,他是一个完整的监测机器性能的程序,太大了,我还没能完全看懂。马上要出差了,没时间再仔细研究,我把到目前为止了解到的情况列一下,各位再继续研究吧。1、例子是msdn里带的,叫permon.到1号盘里搜索一下就能找到。2、要找的注册表主键是隐藏的,在nt\2k里是HKEY_PERFORMANCE_DATA, 98里是HKEY_DYN_DATA,具体的项可能是software\microsoft\windows nt\currentversion\perflic,不一定准确!! 大家再仔细研究研究。3、取cpu使用率的做法如下:“% Processor Time 指处理器执行非闲置线程时间的百分比。这个计数器设计成用来作为处理器活动的主要指示器。它通过在每个范例间隔中衡 量处理器用于执行闲置处理线程的时间,并且用 100% 减去该值得出。(每 台处理器有一个闲置线程,该线程在没有其它线程可以运行时消耗周 期)。可将其视为范例间隔用于做有用工作的百分比。这个计数器显 示在范例间隔时所看到的忙时平均值。这个值是用 100% 减去该服务不活 动的时间计算出来的。“ 基本上我所了解的就这么多了,希望能帮到你!
typedef struct
{
DWORD dwUnknown1;
ULONG uKeMaximumIncrement;
ULONG uPageSize;
ULONG uMmNumberOfPhysicalPages;
ULONG uMmLowestPhysicalPage;
ULONG uMmHighestPhysicalPage;
ULONG uAllocationGranularity;
PVOID pLowestUserAddress;
PVOID pMmHighestUserAddress;
ULONG uKeActiveProcessors;
BYTE bKeNumberProcessors;
BYTE bUnknown2;
WORD wUnknown3;
} SYSTEM_BASIC_INFORMATION;typedef struct
{
LARGE_INTEGER liIdleTime;
DWORD dwSpare[76];
} SYSTEM_PERFORMANCE_INFORMATION;typedef struct
{
LARGE_INTEGER liKeBootTime;
LARGE_INTEGER liKeSystemTime;
LARGE_INTEGER liExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION;// NtQuerySystemInformation(
// IN UINT SystemInformationClass, // information type
// OUT PVOID SystemInformation, // pointer to buffer
// IN ULONG SystemInformationLength, // buffer size in bytes
// OUT PULONG ReturnLength OPTIONAL // pointer to a 32-bit
uKeMaximumIncrement as long
uPageSize as long
uMmNumberOfPhysicalPages as long
uMmLowestPhysicalPage as long
uMmHighestPhysicalPage as long
uAllocationGranularity as long
pLowestUserAddress as long
pMmHighestUserAddress as long
uKeActiveProcessors as long
bKeNumberProcessors as byte
bUnknown2 as byte
wUnknown3 as long
End Typetype SYSTEM_PERFORMANCE_INFORMATION liIdleTime as LARGE_INTEGER
dwSpare(76) as long
End Typetype SYSTEM_TIME_INFORMATION liKeBootTime as LARGE_INTEGER
liKeSystemTime as LARGE_INTEGER
liExpTimeZoneBias as LARGE_INTEGER;
uCurrentTimeZoneId as long
dwReserved as long
end typeDeclare sub NtQuerySystemInformation lib "NtDll.dll"(SystemInformationClass as long, _
SystemInformation as long, _
SystemInformationLength as long, _
Byval SystemInformationLength as long, _
OPTIONAL ReturnLength as long)