Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv ist (https://www.delphipraxis.net/93078-erkennen-ob-bildschirmsch-bzw-bildschirmsperre-aktiv-ist.html)

Kirchi 31. Mai 2007 10:50


Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv ist
 
Hallo zusammen,

:?: wie kann ich programmtechnisch erkennen ob der Bildschirmschoner oder die Bildschirmsperre aktiviert wurde. Ebenfalls wäre für mich der umgekehrte Weg interressant, wann der Bildschirmschoner bzw. die Bildschirmsperre nicht mehr aktiv sind.

:arrow: Mein Grund hierfür ist, ich soll ein Programm entwickeln, welches die Arbeitszeiten am PC automatisch mitlogt. Bei aktiven Bildschirmschoner arbeitet ja keiner am PC und ich muss das log während des Bildschirmschoners bzw. der Bildschirmsperre pausieren lassen.

:thumb: Ich hoffe Ihr könnt mir helfen.

:dp:

s-off 31. Mai 2007 11:01

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Hallo,

zu Deinen Fragen kann ich dir ad hoc jetzt keine Antwort geben.

Was ich mich allerdings frage, ist, ob Dein Ansatz richtig ist.

Es steht zwar außer Frage, dass niemand am Rechner arbeitet, wenn dieser gesperrt bzw. der Bildschirmschoner aktiv ist; aber reichen diese Kriterien aus?

Ich habe bspw. das automatische Aktivieren des Bildschirmschoners deaktiviert.
Und wenn ich telefoniere, dann sperre ich auch nicht gleich die komplette Arbeitsstation *g*

Nach Deinen Kriterien würde ich also permanent am PC arbeiten - würde meinem Chef sicherlich gefallen ;o)

Ich denke, die einzigen sinnvollen Kriterien für Deine Zwecke sind die Tastatur und die Maus.
Diese solltest Du überwachen.

Selbst dann, wenn ich etwas am PC lese, werde ich nicht umher kommen, irgendwann die Maus oder die Tastatur zu benutzen, um bspw. eine Seite 'weiter zu blättern' o.ä.

Mag sein, dass auch mein Vorschlag nicht der sinnvollste ist; vlt. interessiert Dich meine Meinung auch gar nicht - aus meiner Sicht aber ein durchaus diskutables Thema ;)

Luckie 31. Mai 2007 11:25

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Und was ist, wenn ich zu einem Kollegen gehe, um mit ihm was zu besprechen? Oder ich am Whiteboard stehe um was zu skizzieren? Oder wenn ich irgendeine andere Tätigkeit mache, die nichts mit dem Computer zu tun hat?

Eventuell sollte man sich erstmal generell über so ein Konzept Gedanken, bevor man versucht die technischen Probleme zu lösen.

Dunkel 31. Mai 2007 11:43

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Zitat:

Zitat von Luckie
Und was ist, wenn ich zu einem Kollegen gehe, um mit ihm was zu besprechen? Oder ich am Whiteboard stehe um was zu skizzieren? Oder wenn ich irgendeine andere Tätigkeit mache, die nichts mit dem Computer zu tun hat?

Zitat:

Zitat von Kirchi
...ich soll ein Programm entwickeln, welches die Arbeitszeiten am PC automatisch mitlogt.

Es soll wohl nur die Arbeitszeit am PC geloggt werden. Aber so pralle finde ich das auch nicht.

DGL-luke 31. Mai 2007 11:46

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
MSDN-Library durchsuchenGetLastInputInfo oder so ähnlich.

Aber das find ich auch nicht toll.

s-off 31. Mai 2007 12:14

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Den Hintergrund zu erfragen ist hier wohl nicht entscheidend.

Es gibt eine klare Anforderung, und die sollte umgesetzt werden. Da sollte es wohl keine Rolle spielen, ob einer von uns das für sinnvoll hält, oder nicht.

Schau Dir mal diese Komponenten an.
Scheinen exakt das zu machen, was Du wünschst. Dennoch biin ich skeptisch, ob diese Kriterien ausreichen.

Kirchi 31. Mai 2007 12:44

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Danke für eure Bedenken,

Zitat:

Zitat von s-off
Ich denke, die einzigen sinnvollen Kriterien für Deine Zwecke sind die Tastatur und die Maus.
Diese solltest Du überwachen.

Daran hatte ich auch schon gedacht, jedoch ist es schwer zu definieren nach welcher Zeit der User eine Pause eingelegt hat (Nach 3 Minuten keine aktivität oder nach 5 Minuten oder noch höher). :)


Zitat:

Zitat von Luckie
Und was ist, wenn ich zu einem Kollegen gehe, um mit ihm was zu besprechen? Oder ich am Whiteboard stehe um was zu skizzieren? Oder wenn ich irgendeine andere Tätigkeit mache, die nichts mit dem Computer zu tun hat?

Eventuell sollte man sich erstmal generell über so ein Konzept Gedanken, bevor man versucht die technischen Probleme zu lösen.

Um das Konzept hat man sich bereits gedanken gemacht. Solche Punkte können mit Bemerkungen nachträglich hinzugefügt werden. :!:

Ich habe vergessen mitzuteilen, dass die Arbeitszeit für verschiedene Projekte gelogt werden soll. Der Mitarbeiter kann also die sogenannte Stopuhr manuell starten und beenden. Es geht jetzt nur noch darum, dass wenn die Zeit gestartet wurde automatisch diese pausiert wird, wenn der Bildschirmschoner bzw. die Bildschimsperre aktiv ist. :wink:

Ich hoffe das Projekt ist nun ein bisschen klarer.

:hi:

s-off 31. Mai 2007 12:50

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Zitat:

Zitat von Kirchi
Es geht jetzt nur noch darum, dass wenn die Zeit gestartet wurde automatisch diese pausiert wird, wenn der Bildschirmschoner bzw. die Bildschimsperre aktiv ist. :wink:

Na dann denke ich, dass die Komponenten, die ich in meinem letzten Beitrag genannt habe, doch genau das Richtige für Dich sind.

Kirchi 31. Mai 2007 13:10

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Zitat:

Zitat von s-off
Zitat:

Zitat von Kirchi
Es geht jetzt nur noch darum, dass wenn die Zeit gestartet wurde automatisch diese pausiert wird, wenn der Bildschirmschoner bzw. die Bildschimsperre aktiv ist. :wink:

Na dann denke ich, dass die Komponenten, die ich in meinem letzten Beitrag genannt habe, doch genau das Richtige für Dich sind.

Die Komponente sieht gut aus :thumb: , vielleicht weiß aber jemand wie man solche Systemaktivitäten selbst abfangen kann. :)

Luckie 31. Mai 2007 13:14

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
DGL-Luke hat dir doch einen Link gegeben.

Kirchi 31. Mai 2007 14:11

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Zitat:

Zitat von Luckie
DGL-Luke hat dir doch einen Link gegeben.

Dies ist aber eine Komponente, die zu erwerben ist. Vielleicht weiß ja jemand wie man so was selbst programmieren kann.

Luckie 31. Mai 2007 14:16

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Lesen hilft. DGL-Luke und nicht s-off!

bitsetter 31. Mai 2007 15:46

Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Hi,

ob der Bildschirmschoner gerade aktiv ist könnte man so ermitteln:
Delphi-Quellcode:
var
  Running: bool;
begin
  SystemParametersInfo(SPI_GETSCREENSAVERRUNNING,0,@Running,0);
  if Running then
    ...
Getestet unter WinXP und Win98SE.

Schwedenbitter 6. Dez 2010 11:04

AW: Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Ich weiß, dass das Aufwärmen alter Themen wenig Freude auslöst, ABER:

Ich habe ca. am 11. November 2010 ein älteres Update in mein TurboDelphi wegen einer kompletten Win-Neuinstallation hinzugefügt. Bis dahin lief folgender Code:
Delphi-Quellcode:
Function CreateFromScreen: TJPEGImage;

  Function SSaverActive: Boolean;
  Begin
    SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, @Result, 0);
  End;

Begin
  Result:=TJPEGImage.Create;
  Try
    If SSaverActive Then
    Begin
      // Bildschirmschoner beenden
    End;
    // hier wird etwas gemacht...
  Except
    Result.Free;//Bei Fehlern den Speicher freigeben
  End;
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
  With CreateFromScreen Do
  Try
    SaveToFile('Wohinauchimmer.jpg');
  Finally
    Free;
  End;
End;
Seither bekomme ich eine Speicherzugriffsverletzung. Es funktioniert jetzt nur noch so:
Delphi-Quellcode:
  Function SSaverActive: Boolean;
  Begin
    SystemParametersInfo(SPI_GETSCREENSAVERRUNNING, 0, @Result, 0);
  End;

// ^-- Unterfunktion ausgegliedert.

Function CreateFromScreen: TJPEGImage;
Begin
  Result:=TJPEGImage.Create;
  Try
    If SSaverActive Then
    Begin
      // Bildschirmschoner beenden
    End;
    // hier wird etwas gemacht...
  Except
    Result.Free;//Bei Fehlern den Speicher freigeben
  End;
End;
Kann mir das bitte mal jemand erklären?
Ich habe 3 Tage daran gesessen, das in meinem mehrere tausend Zeilen umfassenden Projekt herauszufinden. Und es liegt definitiv an der Funktion
Delphi-Quellcode:
SSaverActive
, weil ich alles andere durchgetest habe. Ist das nur ein Phänomen von TurboDelphi oder schlimmer noch von meiner Installation? Komisch ist, dass es auf 2 Rechnern nicht mehr klappt.

Gruß, Alex

Schwedenbitter 6. Dez 2010 11:26

AW: Re: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv i
 
Ich nehme (fast) alles zurück!
Ich habe mir nochmal den Code von bitsetter angesehen und da ist mir ein kleines Detail aufgefallen: Es muss
Delphi-Quellcode:
Bool
statt
Delphi-Quellcode:
Boolean
heißen; dann klappt es auch mit der Function.

Bleibt nur noch die Frage, warum es bislang klappte?

Luckie 6. Dez 2010 11:35

AW: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv ist
 
Delphi-Quellcode:
Result.Free;//Bei Fehlern den Speicher freigeben
Und im Erfolgsfall nicht?

DeddyH 6. Dez 2010 11:56

AW: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv ist
 
Noch schlimmer: wenn innerhalb der Funktion ein Fehler auftritt, wird das JPEG freigegeben, aber nicht genullt. In der aufrufenden Routine wird dann ggf. versucht, das Objekt erneut freizugeben, das sollte ordentlich knallen. Im Übrigen sollten IMO Funktionen keine Objekte zurückgeben, die sie selbst erzeugen, aber die Diskussion hatten wir ja bereits mehrfach hier.

himitsu 6. Dez 2010 12:04

AW: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv ist
 
Boolean = delphieigener Typ (da sollte einem schnell klar werden, daß dieser bei der WinAPI nicht unbedingt was zu suchen hat)

aktuell:
BOOL = LongBool (LongInt) = 4 Byte (False=0 und True=-1)
Boolean = 1 Byte (False=0 und True=1)
Boolean <> ByteBool = 1 Byte (False=0 und True=-1)
(beim Prüfen: True <> 0)

Schwedenbitter 6. Dez 2010 12:21

AW: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv ist
 
@himitsu
Danke für die Erklärung. Das ist einleuchtend. Aber warum klappte das bislang?

Zitat:

Zitat von DeddyH (Beitrag 1066543)
... das JPEG freigegeben, aber nicht genullt.

Soll ich eine neue Frage aufmachen oder: Wie wird ein TJPEGImage genullt?

Zitat:

Zitat von DeddyH (Beitrag 1066543)
Im Übrigen sollten IMO Funktionen keine Objekte zurückgeben, die sie selbst erzeugen, aber die Diskussion hatten wir ja bereits mehrfach hier.

Kannst Du dazu bitte mal verlinken oder mir einen solchen per PM senden? Danke.

DeddyH 6. Dez 2010 12:23

AW: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv ist
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1066554)
Wie wird ein TJPEGImage genullt?

Entweder nil zuweisen oder mit FreeAndNil freigeben. Zu der Diskussion: den Thread muss ich erst raussuchen, dauert einen Moment.

[edit] Hier ist z.B. so einer: http://www.delphipraxis.net/104839-w...ekte-frei.html [/edit]

Sir Rufo 6. Dez 2010 12:33

AW: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv ist
 
Zitat:

Zitat von himitsu (Beitrag 1066547)
Boolean = delphieigener Typ (da sollte einem schnell klar werden, daß dieser bei der WinAPI nicht unbedingt was zu suchen hat)

aktuell:
BOOL = LongBool (LongInt) = 4 Byte (False=0 und False=-1)
Boolean = 1 Byte (False=0 und False=1)
Boolean <> ByteBool = 1 Byte (False=0 und False=-1)
(beim Prüfen: True <> 0)

Ich habe zwar verstanden, was du meinst, aber es ist faktisch falsch :mrgreen:

BOOL = LongBool (LongInt) = 4 Byte (False=0 und True=-1)
Boolean = 1 Byte (False=0 und True=1)
Boolean <> ByteBool = 1 Byte (False=0 und True=-1)

DeddyH 6. Dez 2010 12:34

AW: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv ist
 
Moment, ist true nicht alles <> 0? Oder weshalb predigen wir immer, dass man nicht auf true prüfen soll?

himitsu 6. Dez 2010 12:37

AW: Erkennen ob Bildschirmsch. bzw. Bildschirmsperre aktiv ist
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1066554)
@himitsu
Danke für die Erklärung. Das ist einleuchtend. Aber warum klappte das bislang?

Erstmal hattest du Glück, daß der Pufferüberlauf entweder nichts Wichtiges überschrieb oder die Speicherausrichtung dir zufällig half.

Und BOOL/LongWool ist 4 Byte, wenn da bei einem True zufällih im niedrigsten Byte ein/einige Bits gesetzt sind, dann wird das auch als True erkannt.

Fazit: du hattest viel Glück


@Sir Rufo: jupp, war'n Denk/-Schreibfehler :oops:
@Detlef: Ja, beim Prüfen muß auf <>0 (not false) verglichen werden.
Die Konstanten für TRUE geben ja nur einen möglichen Wert for.
WinAPI 0 und -1 und beim Delphi-Boolean ist es 0 und 1 und schon erkennt man auch ein kleines Problem ala -1 <> 1.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz