在系统栏显示CPU使用率

来源:互联网 发布:淘宝查关键词排名工具 编辑:程序博客网 时间:2024/05/20 08:27
这是NotifyIcon类,动态显示在系统栏的图标.
  1. Private mNotifyIcon As NOTIFYICONDATA
  2. Private mIcons(12) As Long
  3. Private Sub Class_Initialize()
  4.     Dim IconInf As ICONINFO
  5.     Dim hOldBitmap As Long
  6.     Dim hOldBrush As Long
  7.     Dim hOldPen As Long
  8.     Dim hBitmap As Long
  9.     Dim hDC As Long
  10.     Dim iw As Long
  11.     Dim ih As Long
  12.     Dim i As Long
  13.     Dim t As Long
  14.         
  15.     '获取小图标的尺寸
  16.     iw = GetSystemMetrics(SM_CXSMICON)
  17.     ih = GetSystemMetrics(SM_CYSMICON)
  18.     '创建后台DC
  19.     hDC = CreateCompatibleDC(0&)
  20.     hBitmap = CreateCompatibleBitmap(dc, iw, ih)
  21.     hOldBitmap = SelectObject(hDC, hBitmap)
  22.     
  23.     '设置画笔与刷子
  24.     hOldBrush = SelectObject(hDC, GetStockObject(DC_BRUSH))
  25.     hOldPen = SelectObject(hDC, GetStockObject(DC_PEN))
  26.     
  27.     '用系统颜色清除Bitmap
  28.     SetDCBrushColor hDC, GetSysColor(COLOR_BTNFACE)
  29.     SetDCPenColor hDC, GetSysColor(COLOR_BTNFACE)
  30.     Rectangle hDC, 0, 0, iw, ih
  31.     
  32.     '开始绘背景图
  33.     SetDCBrushColor hDC, RGB(55, 55, 55)
  34.     SetDCPenColor hDC, RGB(55, 55, 55)
  35.     Rectangle hDC, 2, 2, iw - 3, ih - 3
  36.     '顶
  37.     SetDCPenColor hDC, GetSysColor(COLOR_BTNSHADOW)
  38.     Rectangle hDC, 1, 1, iw - 2, 2
  39.     Rectangle hDC, 1, 1, 2, ih - 2
  40.     
  41.     SetDCPenColor hDC, GetSysColor(COLOR_BTNHIGHLIGHT)
  42.     Rectangle hDC, iw - 2, 1, iw - 3, ih - 2
  43.     Rectangle hDC, 2, ih - 2, iw - 2, ih - 3
  44.     
  45.     '将位图中部分区域转换为ICON对象
  46.     SetDCBrushColor hDC, RGB(255, 0, 0)
  47.     SetDCPenColor hDC, RGB(255, 0, 0)
  48.     For i = 0 To UBound(mIcons)
  49.         '开始画图标
  50.         t = ih - 3 - i * ((ih - 5) / 10)
  51.         If t < 2 Then t = 2
  52.         Rectangle hDC, 2, t, iw - 3, ih - 3
  53.         '转换成HICON对象
  54.         With IconInf
  55.             .fIcon = True
  56.             .xHotspot = 0
  57.             .yHotspot = 0
  58.             .hbmColor = hBitmap
  59.             .hbmMask = hBitmap
  60.         End With
  61.         '储存HICON到数组
  62.         mIcons(i) = CreateIconIndirect(IconInf)
  63.     Next
  64.     
  65.     '恢复DC对象,释放资源
  66.     SelectObject hDC, hOldBitmap
  67.     SelectObject hDC, hOldBrush
  68.     SelectObject hDC, hOldPen
  69.     DeleteObject hBitmap
  70.     DeleteDC hDC
  71. End Sub
  72.     
  73. Public Function RegisterNotifyIcon(ByVal hWnd As LongAs Long
  74.     '初始化NotifyIcon;
  75.     With mNotifyIcon
  76.         .uID = 0
  77.         .hWnd = hWnd
  78.         .hIcon = mIcons(0)
  79.         .cbSize = Len(mNotifyIcon)
  80.         .szTip = "CPU使用率:0%" & Chr(0)
  81.         .uCallbackMessage = RegisterWindowMessage( "WM_TRAYCALLBACK" ) 
  82.         .uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
  83.     End With
  84.     
  85.     If Shell_NotifyIcon(NIM_ADD, mNotifyIcon) = 0 Then Exit Function
  86.     RegisterNotifyIcon = mNotifyIcon.uCallbackMessage
  87. End Function
  88. Public Sub Modfiy(ByVal szTipText As StringByVal hTaskBarIcon As Long)
  89.     mNotifyIcon.szTip = szTipText & Chr(0)
  90.     mNotifyIcon.hIcon = hTaskBarIcon
  91.     Shell_NotifyIcon NIM_MODIFY, mNotifyIcon
  92. End Sub
  93. Public Sub Remove()
  94.     Shell_NotifyIcon NIM_DELETE, mNotifyIcon
  95. End Sub
  96. Public Sub Restore()
  97.     Remove
  98.     Shell_NotifyIcon NIM_ADD, mNotifyIcon
  99. End Sub
  100. Public Sub ChangeData(ByVal cpu As Long)
  101.     If cpu < 10 Then
  102.         Modfiy "CPU使用率:" & cpu & "%", mIcons(0)
  103.         Exit Sub
  104.     End If
  105.     
  106.     If cpu < 95 Then
  107.         Modfiy "CPU使用率:" & cpu & "%", mIcons(cpu / 10)
  108.         Exit Sub
  109.     End If
  110.     
  111.     If cpu < 100 Then
  112.         Modfiy "CPU使用率:" & cpu & "%", mIcons(11)
  113.         Exit Sub
  114.     End If
  115.     
  116.     Modfiy "CPU使用率:" & cpu & "%", mIcons(12)
  117. End Sub
  118. Private Sub Class_Terminate()
  119.     Dim i As Integer
  120.     
  121.     Remove
  122.     For i = 0 To UBound(mIcons)
  123.         DestroyIcon mIcons(i)
  124.     Next
  125. End Sub

这个是获取CPU使用率的类:

  1. Option Explicit
  2. Private liOldIdleTime   As LARGE_INTEGER
  3. Private liOldSystemTime As LARGE_INTEGER
  4. Private Sub Class_Initialize()
  5.     Dim SysPerfInfo     As SYSTEM_INF_PREF
  6.     Dim SysTimeInfo     As SYSTEM_INF_TIME
  7.     
  8.     GetSysPerfTime SysPerfInfo, SysTimeInfo
  9.     LSet liOldIdleTime = SysPerfInfo.liIdleTime
  10.     LSet liOldSystemTime = SysTimeInfo.liKeSystemTime
  11. End Sub
  12. Public Function GetCPUUsage() As Long
  13.     Dim SysBaseInfo     As SYSTEM_INF_BASIC
  14.     Dim SysPerfInfo     As SYSTEM_INF_PREF
  15.     Dim SysTimeInfo     As SYSTEM_INF_TIME
  16.     Dim dbIdleTime      As Double
  17.     Dim dbSystemTime    As Double
  18.     
  19.     If NtQuerySystemInformation(SI_BASIC, ByVal VarPtr(SysBaseInfo), Len(SysBaseInfo), 0&) <> NO_ERROR Then Exit Function
  20.     GetSysPerfTime SysPerfInfo, SysTimeInfo
  21.     If liOldIdleTime.HighPart <> 0# Or liOldIdleTime.LowPart <> 0# Then
  22.         dbIdleTime = ULL2Dbl(SysPerfInfo.liIdleTime) - ULL2Dbl(liOldIdleTime)
  23.         dbSystemTime = ULL2Dbl(SysTimeInfo.liKeSystemTime) - ULL2Dbl(liOldSystemTime)
  24.         If dbSystemTime > 0# Then
  25.             dbIdleTime = dbIdleTime / dbSystemTime
  26.             dbIdleTime = 100# - dbIdleTime * 100# / CDbl(SysBaseInfo.bKeNumberProcessors) + 0.5
  27.         End If
  28.     End If
  29.     LSet liOldIdleTime = SysPerfInfo.liIdleTime
  30.     LSet liOldSystemTime = SysTimeInfo.liKeSystemTime
  31.     
  32.     GetCPUUsage = dbIdleTime
  33.     If GetCPUUsage > 100 Then GetCPUUsage = 100
  34. End Function
  35. Private Sub GetSysPerfTime(ByRef sp_inf As SYSTEM_INF_PREF, ByRef st_inf As SYSTEM_INF_TIME)
  36.     If NtQuerySystemInformation(SI_PERF, ByVal VarPtr(sp_inf), LenB(sp_inf), 0&) <> NO_ERROR Then Exit Sub
  37.     If NtQuerySystemInformation(SI_TIME, ByVal VarPtr(st_inf), LenB(st_inf), 0&) <> NO_ERROR Then Exit Sub
  38. End Sub

 

用到的函数与类型声明:

  1. Public Type LARGE_INTEGER
  2.     LowPart     As Long
  3.     HighPart    As Long
  4. End Type
  5. Public Type SYSTEM_INF_PREF
  6.     liIdleTime      As LARGE_INTEGER
  7.     dwSpare(76)     As Long
  8. End Type
  9. Public Type SYSTEM_INF_TIME
  10.     liKeBootTime        As LARGE_INTEGER
  11.     liKeSystemTime      As LARGE_INTEGER
  12.     liExpTimeZoneBias   As LARGE_INTEGER
  13.     uCurrentTimeZoneId  As Long
  14.     dwReserved          As Long
  15. End Type
  16. Public Declare Function NtQuerySystemInformation Lib "Ntdll.dll" ( _
  17.     ByVal SystemInfClass As Long, _
  18.     ByVal SystemInfoAddr As Long, _
  19.     ByVal cbLength As Long, _
  20.     Optional rltLenth As LongAs Long
  21. Public Declare Function FileTimeToSystemTime Lib "kernel32" ( _
  22.     lpFileTime As FILETIME, _
  23.     lpSystemTime As SYSTEMTIME) As Long
  24. Public Declare Function GetLastError Lib "kernel32" () As Long
  25. Public Declare Function GetProcessIoCounters Lib "kernel32" ( _
  26.     ByVal hProcess As Long, _
  27.     lpIoCounters As PIO_COUNTERS) As Long
  28. Public Declare Function CreateCompatibleBitmap Lib "gdi32" ( _
  29.     ByVal hDC As Long, _
  30.     ByVal nWidth As Long, _
  31.     ByVal nHeight As LongAs Long
  32. Public Declare Function CreateCompatibleDC Lib "gdi32" ( _
  33.     ByVal hDC As LongAs Long
  34. Public Declare Function SelectObject Lib "gdi32" ( _
  35.     ByVal hDC As Long, _
  36.     ByVal hObject As LongAs Long
  37. Public Declare Function DeleteObject Lib "gdi32" ( _
  38.     ByVal hObject As LongAs Long
  39. Public Declare Function ReleaseDC Lib "user32" ( _
  40.     ByVal hWnd As Long, _
  41.     ByVal hDC As LongAs Long
  42. Public Declare Function DeleteDC Lib "gdi32" ( _
  43.     ByVal hDC As LongAs Long
  44. Public Declare Function BitBlt Lib "gdi32" ( _
  45.     ByVal hDestDC As Long, _
  46.     ByVal X As Long, _
  47.     ByVal Y As Long, _
  48.     ByVal nWidth As Long, _
  49.     ByVal nHeight As Long, _
  50.     ByVal hSrcDC As Long, _
  51.     ByVal xSrc As Long, _
  52.     ByVal ySrc As Long, _
  53.     ByVal dwRop As LongAs Long
  54. Public Declare Function CreateIcon Lib "user32" ( _
  55.     ByVal hInstance As Long, _
  56.     ByVal nWidth As Long, _
  57.     ByVal nHeight As Long, _
  58.     ByVal nPlanes As Byte, _
  59.     ByVal nBitsPixel As Byte, _
  60.     lpANDbits As Byte, _
  61.     lpXORbits As ByteAs Long
  62. Public Declare Function CreateIconIndirect Lib "user32" ( _
  63.     piconinfo As ICONINFO) As Long
  64. Public Declare Function TextOut Lib "gdi32" Alias "TextOutA" ( _
  65.     ByVal hDC As Long, _
  66.     ByVal X As Long, _
  67.     ByVal Y As Long, _
  68.     ByVal lpString As String, _
  69.     ByVal nCount As LongAs Long
  70. Public Declare Function SetBkMode Lib "gdi32" ( _
  71.     ByVal hDC As Long, _
  72.     ByVal nBkMode As LongAs Long
  73. Public Declare Function SetTextColor Lib "gdi32" ( _
  74.     ByVal hDC As Long, _
  75.     ByVal crColor As LongAs Long
  76. Public Declare Function DestroyIcon Lib "user32" ( _
  77.     ByVal hIcon As LongAs Long
  78. Public Declare Function SetBkColor Lib "gdi32" ( _
  79.     ByVal hDC As Long, _
  80.     ByVal crColor As LongAs Long
  81. Public Declare Function SetDCBrushColor Lib "gdi32" ( _
  82.     ByVal hDC As Long, _
  83.     ByVal crColor As LongAs Long
  84. Public Declare Function SetDCPenColor Lib "gdi32" ( _
  85.     ByVal hDC As Long, _
  86.     ByVal crColor As LongAs Long
  87. Public Declare Function ExtFloodFill Lib "gdi32" ( _
  88.     ByVal hDC As Long, _
  89.     ByVal X As Long, _
  90.     ByVal Y As Long, _
  91.     ByVal crColor As Long, _
  92.     ByVal wFillType As LongAs Long
  93. Public Declare Function Rectangle Lib "gdi32" ( _
  94.     ByVal hDC As Long, _
  95.     ByVal X1 As Long, _
  96.     ByVal Y1 As Long, _
  97.     ByVal X2 As Long, _
  98.     ByVal Y2 As LongAs Long
  99. Public Declare Function GetStockObject Lib "gdi32" ( _
  100.     ByVal nIndex As LongAs Long
  101. Public Declare Function GetSysColorBrush Lib "user32" ( _
  102.     ByVal nIndex As LongAs Long
  103. Public Declare Function GetSysColor Lib "user32" ( _
  104.     ByVal nIndex As LongAs Long
  105. Public Declare Function CreatePen Lib "gdi32" ( _
  106.     ByVal nPenStyle As Long, _
  107.     ByVal nWidth As Long, _
  108.     ByVal crColor As LongAs Long
  109. Public Declare Function GetSystemMetrics Lib "user32" ( _
  110.     ByVal nIndex As LongAs Long
原创粉丝点击