Я хочу отобразить процент заряда батареи как в Win 7, так и в Win 10. Если я могу делать только одно или другое, то Win 10. Я использую .NET во вкусе VB, но я могу читать C #.
Я нашел SystemInformation.PowerStatus. Существует событие для изменения режима питания «SystemEvents.PowerModeChanged», но оно не срабатывает при разрядке аккумулятора. Если я подключаю / отключаю зарядное устройство, то происходит событие.
Я пытаюсь не использовать таймер без необходимости. Если мне нужно использовать таймер, установка его на 1 минуту не должна использовать слишком много ресурсов. По крайней мере, я так не думаю.
По сути, я создал пользовательский элемент управления с меткой, индикатором выполнения и графическим блоком, показывающим плагин. Я скрываю графическое окно, когда не подключен.
Я также добавил счетчик для отладки, чтобы я мог видеть, происходит ли событие, и я обновляю что-то не так. Он срабатывает только когда я подключаю и отключаю зарядное устройство.
Public Overrides Sub Refresh()
RefreshPowerStatus()
MyBase.Refresh()
End Sub
Dim tmpCount As Integer = 0
Public Sub RefreshPowerStatus()
Dim psBattery As PowerStatus = SystemInformation.PowerStatus
BatteryChargingImage.Visible = psBattery.PowerLineStatus = PowerLineStatus.Online
Sleep(50)
psBattery = SystemInformation.PowerStatus
Dim BattPercent As Integer = 0
Dim BattTime As String = ""
If psBattery.BatteryLifeRemaining = -1 Then
BattTime = ""
ElseIf psBattery.BatteryLifeRemaining > 3600 Then
BattTime = "Hr: " & Math.Round(psBattery.BatteryLifeRemaining / 3600, 2).ToString
Else
BattTime = "Min: " & Math.Round(psBattery.BatteryLifeRemaining / 60, 0).ToString
End If
If psBattery.BatteryChargeStatus = BatteryChargeStatus.Critical Then
pbBatteryInfo.ForeColor = Drawing.Color.Red
ElseIf psBattery.BatteryChargeStatus = BatteryChargeStatus.Low Then
pbBatteryInfo.ForeColor = Drawing.Color.Yellow
Else
pbBatteryInfo.ForeColor = Drawing.Color.Green
End If
BattPercent = Math.Round(psBattery.BatteryLifePercent * 100, 0)
If psBattery.BatteryChargeStatus = BatteryChargeStatus.NoSystemBattery Then
lblBatteryInfo.Text = "No Battery"
pbBatteryInfo.Visible = False
Return
ElseIf psBattery.BatteryChargeStatus = BatteryChargeStatus.Charging Then
lblBatteryInfo.Text = "Charging"
Else
lblBatteryInfo.Text = BattPercent.ToString & "% " & BattTime
End If
tmpCount += 1
lblBatteryInfo.Text &= " (" & tmpCount & ")"
pbBatteryInfo.Value = BattPercent
End Sub
Вот мой установочный код ... (Все, что делает SystemEvents_PowerModeChanged (), это вызывает обновление пользовательского элемента управления [код выше]
Dim psBattery = SystemInformation.PowerStatus
Dim tmpDeviceHasNoBatt As Boolean = psBattery.BatteryChargeStatus = BatteryChargeStatus.NoSystemBattery
If IsDebug Then tmpDeviceHasNoBatt = False
If tmpDeviceHasNoBatt Then PowerStatusDisplay.Visible = False
If PowerStatusDisplay.Visible Then
Call PowerStatusDisplay.Refresh()
AddHandler SystemEvents.PowerModeChanged, AddressOf SystemEvents_PowerModeChanged
End If
Я надеялся, что есть другое событие, которое я мог бы использовать, кроме таймера. В сегодняшнем мире, управляемом событиями, таймеры кажутся странными. Но эй, если это сработает, кто может поспорить.