Как долго P C был запущен? - PullRequest
       37

Как долго P C был запущен?

1 голос
/ 10 февраля 2020

Я хотел бы знать, как долго запускается P C. Вот почему я сделал следующую процедуру:

Public Function LipPCIsOn() As String
  Dim iTempoPC As Integer
  Dim tTempoPC As TimeSpan
  Dim strTempoPC As String
  iTempoPC = System.Environment.TickCount
  tTempoPC = TimeSpan.FromMilliseconds(iTimePC)
  strTempoPC = tTempoPC.Duration.ToString("hh:mm:ss")
  Return strTempoPC
End Function

Но я не понимаю, P C, несмотря на то, что он был запущен через 3 минуты, говорит мне: 7:54:36 Где ошибка? Спасибо всем

Ответы [ 2 ]

2 голосов
/ 11 февраля 2020

Может быть какой-то другой источник времени последнего включения, но вы можете использовать системный журнал событий Windows для получения последнего события из Kernel-Boot:

Function GetLastPowerOn() As DateTime?
    Dim systemEventLog = New EventLog()
    systemEventLog.Log = "System"

    Dim lastPowerOn = systemEventLog.Entries.Cast(Of EventLogEntry).
        Where(Function(eu) eu.Source = "Microsoft-Windows-Kernel-Boot").
        OrderByDescending(Function(ev) ev.TimeGenerated).FirstOrDefault()

    Return lastPowerOn?.TimeGenerated

End Function

У меня нет знать поведение, если нет записи, поэтому я предположил, что Nullable (Of DateTime) будет делать. Если вы хотите очистить журнал системных событий, вы можете сообщить нам, что происходит; Я не хочу этого делать.

К сожалению, требуется время, чтобы вернуть значение (например, около 7 секунд на этом компьютере), поэтому вы можете вызвать его асинхронно. Вот пример, который использует одну кнопку и две метки на форме:

Public Class Form1
    Dim tim As Timer

    Friend Async Function GetLastPowerOnAsync() As Task(Of DateTime?)
        Dim systemEventLog = New EventLog() With {.Log = "System"}
        Dim tsk = Await Task.Factory.StartNew(Function()
                                                  Return systemEventLog.Entries.Cast(Of EventLogEntry).
                                                  Where(Function(eu) eu.Source = "Microsoft-Windows-Kernel-Boot").
                                                  OrderByDescending(Function(ev) ev.TimeGenerated).
                                                  FirstOrDefault()
                                              End Function)

        Return tsk?.TimeGenerated

    End Function

    Sub timTick(sender As Object, e As EventArgs)
        Label1.Text = DateTime.Now.ToString("HH:mm:ss")
    End Sub

    Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim lpo = Await GetLastPowerOnAsync()
        If lpo.HasValue Then
            Label2.Text = lpo.Value.ToString("yyyy-MM-dd HH:mm:ss")
        Else
            Label2.Text = "No System event log entry with a source of Microsoft-Windows-Kernel-Boot entry found."
        End If

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        tim = New Timer() With {.Interval = 500}
        AddHandler tim.Tick, AddressOf timTick
        tim.Start()

    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        RemoveHandler tim.Tick, AddressOf timTick
        tim.Dispose()

    End Sub

End Class
0 голосов
/ 08 марта 2020

Спасибо всем. Я просто хотел указать, что: 1) мой P C не сделал реального выключения, но приостановил; 2) правильный код, который я переписал:

Public Function LipPCIsOnNew() As String
  Dim EventoLogApp As New System.Diagnostics.EventLog("System")
  Dim OraACCENSIONE As Date, stMachineName As String

  ' search from the end, to find the last boot faster
  For i = EventoLogApp.Entries.Count - 1 To 1 Step -1

     If EventoLogApp.Entries(i).InstanceId.ToString = 1 Then

        OraACCENSIONE = EventoLogApp.Entries(i).TimeGenerated

        stMachineName = EventoLogApp.Entries(i).MachineName.ToString

        Exit For
     End If
  Next

  Return OraACCENSIONE.ToString

Функция завершения

Теперь все в порядке

Спасибо всем

...