2002.Jul.03
Presented by kouta_y
感想等は掲示板、苦情はメールへ。

' ウィンドウメッセージ
Public Const WM_MOUSEMOVE As Long = &H200 ' マウスが移動した
Public Const WM_LBUTTONUP As Long = &H202 ' マウス左ボタンが解放された
Public Const WM_RBUTTONUP As Long = &H205 ' マウス右ボタンが解放された
' アイコンの設定
Private Const NIM_ADD As Long = &H0 ' アイコン追加
Private Const NIM_MODIFY As Long = &H1 ' アイコン修正
Private Const NIM_DELETE As Long = &H2 ' アイコン削除
' フラグ
Public Const NIF_MESSAGE As Long = &H1 ' メッセージを受け取る
Public Const NIF_ICON As Long = &H2 ' アイコンを表示
Public Const NIF_TIP As Long = &H4 ' ツールチップを表示
' ルートキー
Private Const HKEY_DYN_DATA As Long = &H80000006 ' HKEY_DYN_DATAキー
' サブキー
Private Const STARTSTAT As String = "PerfStats\StartStat" ' 計測開始
Private Const STOPSTAT As String = "PerfStats\StopStat" ' 計測停止
Private Const STATDATA As String = "PerfStats\StatData" ' 現在値
Private Const CPUUSAGE As String = "Kernel\CPUUsage" ' 使用率キー
Private Const KEY_QUERY_VALUE As Long = &H1 ' 読み取り
' アイコンデータ構造体
Public Type NOTIFYICONDATA
cbSize As Long ' 構造体のサイズ
hwnd As Long ' ウィンドウハンドル
uID As Long ' アイコンID(任意)
uFlags As Long ' フラグ
uCallbackMessage As Long ' 通知するメッセージ
hIcon As Long ' アイコンハンドル
szTip As String * 64 ' ツールチップ
End Type
' システムトレイのアイコン操作
Public Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" ( _
ByVal dwMessage As Long, _
lpData As NOTIFYICONDATA _
) As Long
' レジストリキー開く
Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" ( _
ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal ulOptions As Long, _
ByVal samDesired As Long, _
phkResult As Long _
) As Long
' レジストリ値取得
Public 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
' レジストリキー閉じる
Public Declare Function RegCloseKey Lib "advapi32.dll" ( _
ByVal hKey As Long _
) As Long
|
' アイコン追加
Public Function IconAdd(nid As NOTIFYICONDATA) As Long
IconAdd = Shell_NotifyIcon(NIM_ADD, nid)
End Function
' アイコン編集
Public Function IconModify(nid As NOTIFYICONDATA) As Long
IconModify = Shell_NotifyIcon(NIM_MODIFY, nid)
End Function
' アイコン削除
Public Function IconDelete(nid As NOTIFYICONDATA) As Long
IconDelete = Shell_NotifyIcon(NIM_DELETE, nid)
End Function
|
' 使用率計測開始(コンストラクタ)
Public Function StartCPUUsage() As Long
Dim hKey As Long
Dim Usage As Long
' 計測開始
If RegOpenKeyEx(HKEY_DYN_DATA, STARTSTAT, 0, KEY_QUERY_VALUE, hKey) = 0 Then
Call RegQueryValueEx(hKey, CPUUSAGE, 0, ByVal 0, Usage, Len(Usage))
Call RegCloseKey(hKey)
End If
End Function
' CPUの使用率
Public Function GetCPUUsage() As Long
Dim hKey As Long
Dim Usage As Long
' 現在の値を読む
If RegOpenKeyEx(HKEY_DYN_DATA, STATDATA, 0, KEY_QUERY_VALUE, hKey) = 0 Then
Call RegQueryValueEx(hKey, CPUUSAGE, 0, ByVal 0, Usage, Len(Usage))
GetCPUUsage = Usage
Call RegCloseKey(hKey)
End If
End Function
' 使用率取得の終了(デストラクタ)
Public Function EndCPUUsage() As Long
Dim hKey As Long
Dim Usage As Long
' 計測停止
If RegOpenKeyEx(HKEY_DYN_DATA, STOPSTAT, 0, KEY_QUERY_VALUE, hKey) = 0 Then
Call RegQueryValueEx(hKey, CPUUSAGE, 0, ByVal 0, Usage, Len(Usage))
Call RegCloseKey(hKey)
End If
End Function |
| Form1 | |
| (オブジェクト名) | Form1 |
| Caption | 監視中! |
| BorderStyle | 1 - 固定(実線) |
| MaxButton | False |
| MinButton | False |
| Timer1 | |
| (オブジェクト名) | Timer1 |
| Interval | 1000 |
| Label1 | |
| (オブジェクト名) | Label1 |
| Caption | なし |

Private Sub Form_Load()
' アイコンの設定
With nid
.cbSize = Len(nid)
.hwnd = Me.hwnd
.hIcon = Me.Icon ' アイコンハンドルはこれでOK
.uID = 1
.uCallbackMessage = WM_MOUSEMOVE ' MouseMoveに通知する
' .szTip = ""
.uFlags = NIF_ICON Or _
NIF_MESSAGE Or _
NIF_TIP ' アイコン表示&メッセージ通知&ツールチップ表示あり
End With
Me.Visible = 0 ' フォームは隠す
Call IconAdd(nid) ' タスクトレイへ!
Call StartCPUUsage ' 計測開始
End Sub |

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim msg As Long
' 通知メッセージが来た!
msg = X \ Screen.TwipsPerPixelX ' メッセージに翻訳する(ピクセル単位にする)
Select Case msg
Case WM_LBUTTONUP: ' 左クリックされた
Me.Visible = 1 ' フォームを表示する
Me.WindowState = 0
Case WM_RBUTTONUP: ' 右クリックされた
'
End Select
End Sub |
Private Sub Timer1_Timer() Dim tip As String tip = "使用率は " & GetCPUUsage & " %" & vbNullChar Label1.Caption = tip nid.szTip = "CPU監視中!" & vbCrLf & tip ' 2段にする Call IconModify(nid) ' アイコンの編集 End Sub |