Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0077: Wie lange läuft Windows schon?

 von 

Beschreibung 

Dieser Tipp zeigt, wie lange das System schon läuft.

Update am 23. September 2004:
Es wird nun berücksichtigt, dass GetTickCount einen vorzeichenlosen Wert zurück liefert und dieser erst für VB konvertiert werden muss.

Achtung: GetTickCount sollte nicht in Produktivsystemen verwendet werden, da GetTickCount alle 49,7 Tage wieder bei Null zu zählen beginnt (Überlauf des Datentyps).
Wer einen Wert haben will, der zuverlässiger ist, sollte sich laut MSDN Library in Richtung PerformanceCounter informieren, da das System eine PerformanceCounter bereitstellt, welcher einen 8 Byte großen Wert ähnlich dem von GetTickCount bereitstellt.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

GetTickCount

Download:

Download des Beispielprojektes [2,05 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Timersteuerelement "Timer1"
' Steuerelement: Beschriftungsfeld "Label1"
' Steuerelement: Beschriftungsfeld "Label2"

Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Timer1_Timer()
    Dim H As Double, M As Double
    Dim S As Double, MS As Double
    
    Dim strH As String, strM As String
    Dim strS As String, strMS As String
    
    MS = SignedToUnsignedLong(GetTickCount())
    MS = MS / 1000
    
    H = Int(MS / 3600)
    MS = MS - H * 3600
    M = Int(MS / 60)
    MS = MS - M * 60
    S = Int(MS)
    MS = Int((MS - S) * 10)
    
    strH = CStr(H)
    strM = Format(CStr(M), "##00")
    strS = Format(CStr(S), "##00")
    strMS = CStr(MS)
    
    Label1.Caption = strH & ":" & strM & ":" & strS & ":" & strMS
End Sub

Private Function SignedToUnsignedLong(ByVal LongIn As Long) As Double
    If LongIn < 0 Then
        SignedToUnsignedLong = LongIn + 4294967296#
    Else
        SignedToUnsignedLong = LongIn
    End If
End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 7 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Masiar am 01.03.2007 um 12:51

Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () _
As Long
'-----------------------------------------------------------
Private Sub cmdWindowsTime_Click()
'-----------------------------------------------------------Dim duration As String
Dim start As String
Dim d As String, h As String, m As String, s As String

s = GetTickCount() \ 1000
d = CLng(s) \ 86400 '= Tage
s = s - (d * 86400)
h = CLng(s) \ 3600 '= Stunden
s = s - (h * 3600)
m = CLng(s) \ 60 '= Minuten
s = s - (m * 60)
duration = "Der PC läuft seit:" & Chr(10) & _
IIf(d = 0, "", IIf(d > 1, d & "Tage, ", d & "Tag, ")) & _
IIf(h = 1, "1 Stunde, ", h & " Stunden, ") & _
IIf(m = 1, "1 Minute, ", m & " Minuten, ") & _
IIf(s = 1, "1 Sekunde", s & " Sekunden") & "!"

start = "Start: " & FormatDateTime((Now() - d), vbLongDate) & "; " & _
Format(CDate(FormatDateTime(Now(), vbLongTime)) _
- CDate(FormatDateTime(TimeSerial(h, m, s), vbLongTime)), _
"hh:mm:ss")

ActiveSheet.Range("F2").Value = duration & Chr(10) & start
End Sub 'cmdWindowsTime_Click

Kommentar von laurin t. rother am 10.01.2006 um 14:10

also das programm is echt super... ich hab mir als erstes mal ne exe erstellt und das ding in den Autostart gepackt

Kommentar von am 04.11.2005 um 11:38

49,7 Tage * 86400 Sekunden/Tag * 1000 ms/Sekunde ) = 2^32
Da die Millisekundenzähler bei älteren Windows-Versionen nur 32 Bit breit waren, läuft so ein Zähler genau nach 49 Tagen und 17 Stunden über ==> weiße Buchstaben auf blauem Hintergrund ;-)

Kommentar von Sensei am 12.05.2005 um 10:42

Für alle, die hier nur C+P gemacht haben, der Timer Intervall muss noch manuell auf 50 gesetzt werden ;-)
...So wie es im Beispielprojekt des Downloades bereits ist!

Kommentar von Exp-Soft am 15.06.2004 um 09:31

also ich hatte meinen Rechner fast 50 Tage am stück am laufen leider Meldete sich mein rechner nach 49 Tagen und 22 stunden mit einem Bluescreen. Hat Ms da ne Funktion eingebaut das nen Windows nie länger als 49 Stunden läuft?

Bzw. kann man von VB nicht aufs Bios eventuell die Laufzeitdes systems abfragen? bin der meinung gewesen da irgendwas ma drüber gelesen zu haben das es nen Interrupt dafür gibt, wenn man über Windows überhauptdrauf zugreifen darf!!

Kommentar von Eraser am 08.04.2004 um 15:14

Wenn der PC schon einige Monate lang an ist könnte man das Änderungsdatum der pagefile.sys vergleichen. Leider ist diese Datei nicht immer auf C:\
Zu einer Netzwerkverbindung merkt sich Windows auch wie lange sie schon offen ist.

Kommentar von Frank Dzaebel am 06.12.2001 um 10:16

Oder einfacher: Label1.Caption = FormatDateTime(TimeSerial(0, 0, GetTickCount() \ 1000), vbLongTime)