Delphi-PRAXiS
Seite 2 von 3     12 3      

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 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]


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:10 Uhr.
Seite 2 von 3     12 3      

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