Entwickler-Ecke

Windows API - System inaktiv? [gelöst]


patrick - Mo 08.09.03 12:18
Titel: System inaktiv? [gelöst]
gibt es einen windows-parameter, welcher darstellt ob der PC gerade Inaktiv ist oder nicht?

unter inaktiv verstehe ich:
keine aktiven tasks, keine mausbewegungen, keine tastenklicks?

ich schreibe gerade an einem programm welches nach einer bestimmten zeitraum bei inaktivität starten soll.


MSCH - Mo 08.09.03 13:04

Schreib dein Programmcode in einen Thread mit der Prio tpIdle. Der wird dann nur ausgeführt, wenn das system im Leerlauf ist.
grez
msch


patrick - Mo 08.09.03 17:25

danke,
aber damit wäre nur ein teil des problems gelöst.
wie sieht es mit keine mausbewegungen und keine tastenklicks aus?
das system ist ja auch nicht ausgelasstet wenn der user gerade etwas auf dem pc liest.


matze - Mo 08.09.03 17:36

also ob die maus bewegt wird kann man so abfragen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
  tempX:integer=0;
  tempY:integer=0;
  idletime:integer=0;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
     if (tempX = mouse.CursorPos.x) OR (tempY = mouse.CursorPos.y) then
        inc (idletime)
     else
         idletime := 0;

Caption := FloatToStr ( idletime / 10);

if (idletime / 10) > 40 then caption := caption + '  User ist Idle seit ' + FloatToStr(trunc (idletime/10/60)) + ' Minuten';


tempX := mouse.CursorPos.x;
tempY := mouse.CursorPos.y;
end;

Der Timer ist auf 100ms gestellt !
Das ist nciht die eleganteste Methode aber das geht !


patrick - Mo 08.09.03 17:49

fast 100% die selbe funktion hab ich mir auch schon ausgedacht, allerdings bereiten mir die tasteneingaben sorgen.

hooks möchte ich eigendlich nicht verwenden...

wie machte es den der Windows bildschirmschoner?


MSCH - Mo 08.09.03 18:40

Der abgebildetete Code hat ein Nachteil, die Mausbewegungen aus Non-Client-Bereich werden nicht aufgezeichnet, ebenso verhält es sich mit Tastatureingaben. Sowie das Fenster den Focus verliert, erhält es auch KEINE Mouse - und Tastaturevents mehr.
Hier bleibt nur die Möglichkeit, sich in die Nachrichtenschleife (Suche in: Delphi-Forum, Delphi-Library HOOK) einzuhängen, ODER seine Anwendung als Screen-Saver zu programmieren.
grez
msch


matze - Di 09.09.03 14:57

also mein code funzt auch, wenn das fenster keinen focus hat !!!


patrick - Mi 10.09.03 09:25

naja, da werden mir wohl nicht so viele andrer möglichkeiten bleiben :eyes:
dann eben mit n paar haken (und ner angel, gummistiefel und nem capingstuhl)


DaRkFiRe - Fr 12.09.03 07:34

@MSCH: das mit dem tpIdle-Thread ist Theorie - der läuft bei mir fast immer, auch wenn andere Programme laufen und wenn die Maus bewegt wird. Das ist nur die niedrigste Threadpriorität.


MSCH - Fr 12.09.03 09:21

nicht nur Theorie. Der wird nur ausgeführt, wenn das System im Leerlauf ist. Und Mausgeschubse und Tastenquälerei ist nun nicht gerade Zeitaufwändig. Schau die Im Tastmanager mal die Leerlaufzeiten an. Die meiste Zeit wartet die Kiste auf den, der davor sitzt und sich abrackert.

Probier es es. Schreib ein Thread und lass nebenbei mal ne Stunde die Kiste was extensiv berechnen. Nix da, mit Leerlauf. Also Thread steht.

grez
msch


Tana´Ri - Fr 12.09.03 09:46

vielleicht hilft das weiter


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Function LastInput: boolean;
 var LInput : tagLASTINPUTINFO;
 const TIMELIMIT = 10000;
 begin
   result := false;
   LInput.cbSize := SizeOf(tagLASTINPUTINFO);
   GetLastInputInfo(LInput);
   if (GetTickCount - LInput.dwTime) > TIMELIMIT then result := true;
end;


patrick - Sa 13.09.03 20:59

vielen dank Tana´Ri ich werde den code schnellstmöglich (morgen oder montag) ausprobieren und euch das ergebnis wissen lassen

CUall


patrick - Di 16.09.03 09:34

Tana´Ri dein code funktionert leider nicht (win98).
beim kompillieren kommt ne fehlermeldung das die funktion tagLASTINPUTINFO in dll-sowieso nicht gefunden werden kann.


Delete - Di 16.09.03 18:11

Logisch:
PSDK hat folgendes geschrieben:

Minimum operating systems: Windows 2000


patrick - Di 16.09.03 21:56

:oops: :oops: :oops:


Tana´Ri - Do 18.09.03 08:59

Tut mir leid, da hatte ich keine acht gehabt, das es sich nur um Win98 dreht. Der Gedanke [helfen] zählt :lol:


patrick - Do 18.09.03 09:18

neinnein der code ist in ordung, es wäre zwar besser gewesen wenn es win9x kompatibel gewesen wäre, aber so ist es auch in ordnung
vielen dank für den gedanken :P