![]() |
PC "AN ZEIT" auslesen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute,
ich weiß nicht ob ihr das kennt. LAN Party o.ä. da habt ihr sicher auch schon einmal den Satz gehört: "Ihr sitzt doch nur das ganze Wochenende vorm Rechner". In Wahrheit sieht das ganze ja 'etwas' anders aus. Aber da mich generell mal interessieren würde, wie lange man der Rechner an ist und wie lange man ihn auch benutzt wollte ich ein Programm dafür schreiben. Eine kleine Grundlage dafür habe ich schon geschaffen. Mit folgender Procedure lese ich die Zeit aus, die der PC schon eingeschaltet ist.
Delphi-Quellcode:
Und mit
procedure GetWindowsUpTime(var ADay, AHours, AMinutes, ASeconds: Integer);
const OneDay : Integer = 1000 * 60 * 60 * 24; OneHour : Integer = 1000 * 60 * 60; OneMinutes : Integer = 1000 * 60; OneSecond : Integer = 1000; var Start : Integer; d, h, s: Integer; begin Start:=GetTickCount; ADay:=Start div OneDay; //Tage d:=Start mod OneDay; AHours:=d div OneHour; //Stunden h:=d mod OneHour; AMinutes:=h div OneMinutes; //Minuten s:=h mod OneMinutes; ASeconds:=s div OneSecond; //Sekunden end;
Delphi-Quellcode:
Wird die Zeit auf einem Label ausgegeben.
procedure TfrmMain.Timer1Timer(Sender: TObject);
var Tage, Stunden, Minuten, Sekunden: Integer; begin GetWindowsUpTime(Tage, Stunden, Minuten, Sekunden); //Laden der Zeit lblUpTime.Caption:=Format(' %d Tagen, %d Stunden, %d Minuten und %d Sekunden', [Tage,Stunden,Minuten,Sekunden]) //Ausgabe der Zeit end; Nun habe ich aber ein Problem. Und zwar will ich wissen, wie lange ich den PC auch benutze. Ich habe mir das so vorgestellt, das ich einfach gucke ob die Maus benutzt wird oder nicht. Und jeweils ein Abstand vom benutzen bis nicht benutzen von 1 Min oder so (frei wählbar!!!) bewahrt wird, bist angefangen wird zu zählen. Dann habe ich ja die Zeit in der ich aktiv bin. Die Zeit der inaktivität kann man dann ja einfach ausrechnen. Zitat:
Des weiteren will ich einmal eine Art Stoppuhr einbauen, sprich wenn man auf Start und Stopp klickt wird gezählt und dann soll noch eine Funktionen hinzukommen, wenn ein bestimmtes Programm läuft, wie lange das läuft. Das soll dann auch beim nächsten Start weiterzählen und nicht wieder bei 0 anfangen. Im Anhang hab ich mal ein Screenshot der Alphaversion, das soll helfen, das ihr mein Anliegen versteht! Über die Optik etc können wir später nochmal sprechen, es geht mir erstmal um die Funktionen! |
Re: PC "AN ZEIT" auslesen
Eigentlich keine schlechte Idee sowas.
Ich sehe hier keine Probleme:Gesamtzeit - Aktive Zeit = Inaktive Zeit Wobei das in Delphi so aussehen würde/könnte: Inaktive_Zeit:=abs(Gesamtzeit - Aktive Zeit) das ABS ist ganz Praktisch. Habe ich aber erst später erfahren. Das verhindert das du ein - bei dem wert hast. |
Re: PC "AN ZEIT" auslesen
hi,
dafür müsstest du imho einen keyboard- und mousehook machen. das geht aber nur aus ner dll raus. und manche antivirenprogramme finden sowas nicht gut und meckern dann^^ musst mal im forum nach mousehook oder heyhook suchen ich hab damit schon mal was gemacht ist aber länger her... auf jedenfall müsstest du halt irgendwelche tresholds definieren dass z.b. wenn kein mousemove-event vom mousehook mehr aufgerufen wurde seit 20 sekunde oder so macht er sich einen timestamp und wenn dann der status wieder nach pc wird verwendet gewechselt wird speichert er die zeit von diesem timestamp bis jetzt als inaktiv(addiert den zur inaktiven gesamtzeit) oder halt nicht.
Delphi-Quellcode:
dChangeToInactive ist vom typ TDateTime
//keine mousemove-events für xx sekunden
dChangeToInactive := Now(); //wieder ein mousemove-event da iTotalInactiveTime := iTotalInactiveTime + SecondsBetween(Now, dChangeToInactive); iTotalInactiveTime ist Int64 oder Integer die unit "DateUtils" muss in die uses-klausel eingefügt werden. was auch noch ein prolem werden könnte ist wenn der pc abstürzt... am besten du speicherst alle 10 minuten oder so die gesamtzeiten |
Re: PC "AN ZEIT" auslesen
Einen Hook braucht man dazu eigentlich nicht gleich, die Zeit seit der letzten Eingabe bekommt man auch so raus:
![]() |
Re: PC "AN ZEIT" auslesen
Zitat:
Das wird kritisch, wenn man Spiele spielen will. Das mit dem Hook ist schon der richtige Ansatz. |
Re: PC "AN ZEIT" auslesen
Naja was passiert den wenn du dir ein Video anschaust oder nur ein paar minuten Musik hörst, ohne die Maus zu bewegen
oder eine Taste zubetätigen ist das dann inaktive zeit obwohl du ja eigentlich vor dem Rechner sitzt!? Das finde ich ist das schwierige an der ganzen Sache, evtl. ist es ja möglich raus zu finden wann sich der Bildschirmschoner einschaltet und das man dann diese Zeit als inaktive zeit ansieht, nur so eine Idee die mir spontan eingefallen ist. Ansich ist das Projekt ganz interessant. |
Re: PC "AN ZEIT" auslesen
Zitat:
Ich glaube, ich könnte da mal Code zusammensuchen. Getrennt voneinander habe ich beides irgendwo liegen... Grüße Malte |
Re: PC "AN ZEIT" auslesen
Danke für eure Antworten und Ideen
Zitat:
Zitat:
Zitat:
Allerdings kommt da wieder das Problem durch, das einige gar keinen Bildschirmschon haben bzw diesen nicht nutzen, so wie z.B. ich. Was ggf noch ne Lösung sein könnte, wäre zu gucken ob sich etwas auf dem Bildschirm geändert hat. Sprich man vergleicht 2 Bilder mit einander. Aber das kommt denke ich nicht in Frage da das A) zu aufwendig ist und B) sicherlich viel Leistung zieht, und das soll ein Programm, welches im Hintergrund läuft eben nicht! |
Re: PC "AN ZEIT" auslesen
Zitat:
|
Re: PC "AN ZEIT" auslesen
Delphi-Quellcode:
Ich habe im Moment nicht den Überblick auf welchen Windows-Versionen das so klappt...
uses Registry;
//aktuellen Screensaver auslesen function getSs: String; function ExtractLongPathName(FileName: String): String; var F: TSearchRec; begin if FindFirst(FileName, faAnyFile, F) = 0 then Result := IncludeTrailingPathDelimiter(ExtractFilePath(FileName)) + F.Name else Result := ''; FindClose(F); end; var Reg: TRegistry; begin Reg := TRegistry.Create; try Reg.RootKey := HKEY_CURRENT_USER; if Reg.OpenKey('\Control Panel\Desktop', False) then begin Result := Reg.ReadString('SCRNSAVE.EXE'); Reg.CloseKey; end else Result := ''; if Result <> '' then Result := ExtractLongPathName(Result); finally Reg.Free; end; end; Diese Funktion versucht anhand des Dateinamens einer Anwendung die Prozess-ID herauszufinden. Läuft kein Prozess mit diesem ExeNamen, gibt die Funktion 0 zurück.
Delphi-Quellcode:
In Kombination kannst du so prüfen, ob der aktuelle Standard-Bildschirmschoner gerade den Bildschirm schont.
function GetProcessIdByExeName(const AExeName: string): Cardinal;
var SnapShot: THandle; p: TProcessEntry32; begin Result := 0; p.dwSize := SizeOf(p); SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if SnapShot = INVALID_HANDLE_VALUE then RaiseLastOSError; try if Process32First(SnapShot, p) then repeat if AnsiLowerCase(AExeName) = AnsiLowerCase(p.szExeFile) then Result := p.th32ProcessID; until (Result <> 0) or not Process32Next(SnapShot, p); finally CloseHandle(SnapShot); end; end; Ich habe aber irgendwie noch im Hinterkopf, dass es einen besseren Weg gibt, um zu prüfen, ob gerade ein Bildschirmschoner läuft. Ich kann aber auf die schnelle nichts finden. Grüße Malte |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz