VB 程式碼查詢 MSAcpi_ThermalZoneTemperature 取得 CPU 溫度,但數值靜態不變;打開 SpeedFan 後 WMI 數值卻會動態更新。
ExecQuery 只讀取當前快取值,不會觸發硬體感測器即時採樣。Private Sub Timer1_Timer()
Label1.Caption = "CPU 溫度: " & GetCPUTemperature() & " °C"
End Sub
Function GetCPUTemperature() As Double
Dim objWMI, colItems, objItem
Set objWMI = GetObject("winmgmts:\\.\root\WMI")
Set colItems = objWMI.ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature")
For Each objItem In colItems
GetCPUTemperature = (objItem.CurrentTemperature - 2732) / 10 ' 轉攝氏
Next
End Function
設定 Timer Interval 為 1000~5000ms 視需求調整。
' 需確認硬體支援 __InstanceModificationEvent
Set objEventSource = GetObject("winmgmts:\\.\root\WMI")
Set objEvent = objEventSource.ExecNotificationQuery( _
"SELECT * FROM __InstanceModificationEvent WITHIN 2 WHERE TargetInstance ISA 'MSAcpi_ThermalZoneTemperature'")
Do
Set objItem = objEvent.NextEvent
' 處理 objItem.TargetInstance.CurrentTemperature
Loop
MSAcpi_ThermalZoneTemperature,部分需改用 Win32_TemperatureProbe 或廠商專屬 WMI 命名空間。(Kelvin - 2731.5) / 10 = °C。