Hallo liebe Community,
ich arbeite an einem größeren Projekt in dem ich unter anderem die Aktuelle Spielzeit und die Gesamtspielzeit berechnen will. Ich habe das nun in einem kleinen Test-Projekt aufgebaut. Leider funktioniert die Berechnung der Gesamtspielzeit während das Spiel (in dem Fall das Programm Notepad) läuft nicht, und ich komme einfach nicht weiter. Evtl kann mir hier ja jemand helfen.
AutoIt
#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>
#include <Process.au3>
#include <Date.au3>
Global $regKey = "HKEY_CURRENT_USER\Software\aMyCompany\MyGame"
Global $regValuePlayTime = "TotalPlaytime"
Global $REG_STR_TYP = "REG_SZ"
Global $iStartTime = 0
Global $iWarningCounter = 1
Global $iTimeToWarning = 60 ; Anzahl der Minuten bis zur nächsten Warnung (Default: 60)
Global $iTotalPlaytime = 0
Global $sPlayTimeColor = "#008000"
Global $sSpielProcess = "Notepad.exe"
Global $hSpielHandle = -1
Global $sTitleSpiel = "Unbenannt"
Global $iStartTimeOfGame = 1 * 1000 ;in Millisekunden
; Gesamtspielzeit aus der Registrierung lesen
$iTotalPlaytime = RegRead($regKey, $regValuePlayTime)
If @error Then
ConsoleWrite("Fehler beim Lesen der Registry")
$iTotalPlaytime = 0
EndIf
ConsoleWrite("Gesamtspielzeit: " & _ConvertToTime($iTotalPlaytime) & @CRLF)
Global $hWH = GUICreate("Spielzeit Aufzeichnung", 100, 200, -1, -1)
Global $hButtonSpielen = GUICtrlCreateButton("Spielen", 10, 20, 80, 30)
Global $hButtonAktSpielzeit = GUICtrlCreateButton("Spielzeit", 10, 60, 80, 30)
Global $hButtonGesSpielzeit = GUICtrlCreateButton("GesSpielzeit",10,100,80,30)
GUISetState()
While 1
If _SpielLaueft($sSpielProcess, $hSpielHandle, $sTitleSpiel, $iStartTime, $iStartTimeOfGame) Then ; Überwache die Spielzeit nur, wenn das Spiel läuft
_MonitorPlayingTime($iStartTime, $iTimeToWarning, $iWarningCounter)
Else
If $hSpielHandle <> -1 And Not ProcessExists($sSpielProcess) And $iStartTime <> 0 Then
_StopGame($iStartTime, $hSpielHandle, $iTotalPlaytime, $sPlayTimeColor)
EndIf
EndIf
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
;$iTotalPlaytime = 0
RegWrite($regKey, $regValuePlayTime, $REG_STR_TYP, $iTotalPlaytime)
If @error Then ConsoleWrite("Fehler beim Schreiben in die Registry")
ProcessClose($sSpielProcess)
Exit
Case $hButtonSpielen
Run("notepad.exe")
Case $hButtonAktSpielzeit
ConsoleWrite("Aktuelle Spielzeit: " & _CurrentPlayTime($iStartTime) & @CRLF)
Case $hButtonGesSpielzeit
If _SpielLaueft($sSpielProcess, $hSpielHandle, $sTitleSpiel, $iStartTime, $iStartTimeOfGame) Then
$elapsedTime = _GetElapsedTime($iStartTime)
If $iTotalPlaytime >= $elapsedTime / 1000 Then
$iTotalPlaytime -= $elapsedTime / 1000 ; Ziehe vergangene Spielzeit von der Gesamtspielzeit ab
Else
$iTotalPlaytime = 0 ; Setze die Gesamtspielzeit auf 0, wenn sie unter 0 fällt
EndIf
RegWrite($regKey, $regValuePlayTime, $REG_STR_TYP, $iTotalPlaytime)
If @error Then ConsoleWrite("Fehler beim Schreiben in die Registry")
EndIf
ConsoleWrite("Aktuelle Spielzeit: " & _CurrentPlayTime($iStartTime) & @CRLF)
ConsoleWrite("Gesamtspielzeit: " & _ConvertToTime($iTotalPlaytime) & @CRLF)
EndSwitch
WEnd
Exit
;########################################################################
Func _SpielLaueft($_sProcessName, ByRef $_hSpielHandle, $_sSpielTitel, ByRef $_iStartTime, $_iStartTimeOfGame)
If ProcessExists($_sProcessName) Then
If $_iStartTime = 0 Then
WinActivate($_sSpielTitel)
WinWaitActive($_sSpielTitel, "", 30)
Sleep($_iStartTimeOfGame) ; Warte 15 Sekunden, um die Startverzögerung zu berücksichtigen
$_iStartTime = _Date_Time_GetTickCount()
$_hSpielHandle = WinGetHandle($_sSpielTitel)
ConsoleWrite("Spiel startet..." & @CRLF)
ConsoleWrite("Spielzeit wird aufgezeichnet" & @CRLF)
EndIf
Return True
Else
Return False
EndIf
EndFunc
Func _MonitorPlayingTime($_iStartTime, $_iTimeToWarning, ByRef $_iWarningCounter)
Local $elapsedTime = _Date_Time_GetTickCount() - $_iStartTime
If $elapsedTime >= $_iTimeToWarning * 60000 * $_iWarningCounter Then
ConsoleWrite("Du spielst bereits seit " & ($_iTimeToWarning * $_iWarningCounter) & " Minuten." & @CRLF)
$_iWarningCounter += 1
EndIf
EndFunc
Func _StopGame(ByRef $_iStartTime, ByRef $_hSpielHandle, ByRef $_iTotalPlaytime, $_sPlayTimeColor)
If $_iStartTime = 0 Then Return
Local $elapsedTime = _Date_Time_GetTickCount() - $_iStartTime
; Füge die Spielzeit der aktuellen Sitzung zur Gesamtspielzeit hinzu
$_iTotalPlaytime += $elapsedTime ;/ 1000 ;Teile durch 1000, um Sekunden zu erhalten
ConsoleWrite("Aktuelle Spielzeit nach Beenden: " & _ConvertToTime($elapsedTime) & @CRLF)
ConsoleWrite("Neue Gesamtspielzeit nach Beenden: " & _ConvertToTime($_iTotalPlaytime) & @CRLF)
; Zurücksetzen der Startzeit und des Spielhandles
$_iStartTime = 0
$_hSpielHandle = -1
EndFunc
Func _CurrentPlayTime($_iStartTime)
If $_iStartTime <> 0 Then
Local $elapsedTime = _Date_Time_GetTickCount() - $_iStartTime
Local $sCurrentPlayTime = _ConvertToTime($elapsedTime)
Return $sCurrentPlayTime
EndIf
EndFunc
Func _ConvertToTime($milliseconds)
Local $years = Int($milliseconds / (86400000 * 365))
Local $days = Int(($milliseconds - ($years * 86400000 * 365)) / 86400000)
Local $hours = Int(Mod($milliseconds, 86400000) / 3600000)
Local $minutes = Int(Mod($milliseconds, 3600000) / 60000)
Local $seconds = Int(Mod($milliseconds, 60000) / 1000)
Local $timeString = ""
If $years > 0 Then
$timeString &= $years & " Jahre, "
EndIf
If $days > 0 Then
$timeString &= $days & " Tage, "
EndIf
If $hours > 0 Then
$timeString &= $hours & " Stunden, "
EndIf
If $minutes > 0 Then
$timeString &= $minutes & " Minuten, "
EndIf
If $seconds > 0 Then
$timeString &= $seconds & " Sekunden, "
EndIf
If StringLen($timeString) > 0 Then
$timeString = StringTrimRight($timeString, 2) ; Entferne das letzte Komma und Leerzeichen
Else
$timeString = "0 Sekunden"
EndIf
Return $timeString
EndFunc
Func _GetElapsedTime($_iStartTime)
Local $iCurrentTime = _Date_Time_GetTickCount()
Local $iTimeDiff = $iCurrentTime - $_iStartTime
If $iTimeDiff < 0 Then
$iTimeDiff += 0xFFFFFFFF ; Berücksichtigt 32-Bit-Überlauf
EndIf
Return $iTimeDiff
EndFunc
Alles anzeigen
Vielen lieben Dank
Gruß OhnePlan