Ищете событие, когда процент батареи меняется на Win OS - PullRequest
0 голосов
/ 17 мая 2019

Я хочу отобразить процент заряда батареи как в 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

Я надеялся, что есть другое событие, которое я мог бы использовать, кроме таймера. В сегодняшнем мире, управляемом событиями, таймеры кажутся странными. Но эй, если это сработает, кто может поспорить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...