应该是这个,API VIEW定义的不能用。返回的为Boolean, 不是long
Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, Daa As NOTIFYICONDATA) As Boolean
老问题了,这是API Viewer中的Bug,注意下面:
Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias " Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
哦,那个程序现贴在下面了!
在窗体中:
Option Explicit
Private Const REG_DWORD = 4
Private Const HKEY_DYN_DATA = &H80000006
Private 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 ' Note that if you declare the lpData parameter as String, you must pass it By Value.
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 Sub Exit_Click()
End
End Sub
Private Sub Form_Load()
If App.PrevInstance Then '判断是否有同一个程序实例已运行
End
End If
nid.cbSize = Len(nid)
nid.hWnd = FrmMain.hWnd
nid.uld = vbNull
nid.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
nid.uCallBackMessage = WM_MOUSEMOVE
nid.hIcon = FrmMain.Icon
nid.szTip = "CPU情况查看器" & vbNullChar
Shell_NotifyIcon NIM_ADD, nid '将托盘图标加入系统区中
Call InitCPU '初始化CPU查看器
Call WindowsOnTop '使该程序窗口总是在其他程序窗口之上
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim msg As Long
On Error Resume Next
msg = X / Screen.TwipsPerPixelX
Select Case msg '处理系统区图标的鼠标点击事件
Case WM_RBUTTONDOWN '右键单击
Case WM_RBUTTONUP
PopupMenu Popmenu
Case WM_LBUTTONDBLCLK '左键双击
FrmMain.Show
End Select
End Sub
Private Sub Form_Unload(Cancel As Integer)
Shell_NotifyIcon NIM_DELETE, nid '系统退出时,清除系统区的托盘图标
End Sub
Private Sub HideWindow_Click()
FrmMain.Hide
End Sub
Private Sub ShowWindow_Click()
FrmMain.Show
End Sub
Private Sub Timer1_Timer()
Dim lData As Long, lType As Long, lSize As Long
Dim hKey As Long
Dim hh As Long, qry As Variant
'打开注册键
qry = RegOpenKey(HKEY_DYN_DATA, "perfstats\stadata", hKey)
If qry <> 0 Then
MsgBox "不能获取CPU状况的注册信息"
Unload Me
End If
lType = REG_DWORD
lSize = 4
'从注册表中查询CPU使用情况,并且显示在窗口中
qry = RegQueryValueEx(hKey, "kernel\cpuusage", 0, lType, lData, lSize)
Me.lable1.Caption = "CPU使用情况:" & Str(lData) & "%" & vbNullChar
qry = RegCloseKey(hKey)
With nid
.szTip = "CPU使用情况:" & Str(lData) & "%" & vbNullChar '更改提示信息
.cbSize = Len(nid)
End With
hh = Shell_NotifyIcon(NIM_MODIFY, nid) '修改托盘图标的某些特征
End Sub
Private Sub WindowsOnTop()
'该子程序使用本窗口显示在最上面
Const SWP_NOSIZE = &H1
Const HWND_TOPMOST = -1
If SetWindowPos(FrmMain.hWnd, HWND_TOPMOST, 0, 0, 0, SWP_NOSIZE) = True Then
SUCCESS% = SetWindowPos(FrmMain.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE)
End If
End Sub
Private Sub InitCPU()
Dim lData As Long, lType As Long, lSize As Long
Dim hKey As Long, qry As Variant
qry = RegOpenKey(HKEY_DYN_DATA, "perstats\startstat", hKey)
If qry <> 0 Then
MsgBox "不能获取CPU状况的注册信息"
Unload Me
End If
lType = REG_DWORD
lSize = 4
qry = RegQueryValueEx(hKey, "kernel\cpuusage", 0, lType, lData, lSize)
qry = RegCloseKey(hKey)
End Sub
在模块中的:
Option Explicit
Public Type NOTIFYICONDATA '定义创建托盘图标所需的结构
cbSize As Long
hWnd As Long
uld As Long
uFlags As Long
uCallBackMessage As Long
hIcon As Long
szTip As String * 64
End Type
'定义使用托盘图标所需的常数
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H203
Public Const NIM_DELETE = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
'定义鼠标按键的各种值
Public Const WM_MOUSEMOVE = &H200
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Global nid As NOTIFYICONDATA '定义一种结构变量
Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias " Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long