Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Bildschirmschoner beenden aus Delphi-Anwendung (https://www.delphipraxis.net/109526-bildschirmschoner-beenden-aus-delphi-anwendung.html)

Schwedenbitter 11. Sep 2010 12:03

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Zitat:

Zitat von turboPASCAL (Beitrag 1048830)

Leider nein. Trotzdem Danke.

Grundsätzlich soll der Bildschirmschoner ja laufen. Er soll meine "Bildschirme schonen", wie der Name schon sagt. Und da mein Programm ähnlich einem Service immer mitläuft, will ich daran nichts ändern. Ich möchte ihn weder ganz ausschalten, noch beim Start (TMessage.Result) unterdrücken.
Ich habe auch bei meinen Tests festgestellt, dass
Delphi-Quellcode:
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0);
einen einmal laufenden Bildschirmschoner eben nicht beendet. Wäre auch zu einfach und schön gewesen :lol:

Ich möchte ihn lediglich kurz unterbrechen. Meinetwegen auch beenden, da er nach Ablauf einer bestimmten Zeit ohnehin wieder startet. Die Idee mit dem WM_Close gefiel mir daher. Evtl. könnte man über die vom Systemgelieferte Start-Message auch das Handle merken und dann einfach das schließen?

Ist jemandem bekannt, ob bei Msg.wParam = SC_SCREENSAVE das Handle in einem der Record-Variablen mitgeliefert wird? Ich kann das schlecht ausprobieren, da spätestens bei meiner Interaktion der Schoner beendet wird, ich aber auch nicht wild irgend etwas schließen möchte.

Gruß, Alex

Schwedenbitter 11. Sep 2010 12:22

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Ich haber vermutlich hier (How to force a screen saver to close once started in Windows NT) etwas gefunden.

Ich werde das später mal ausprobieren. Habe im Moment leider keine Zeit.
Diese Darstellung bringt mich aber zurück zu meiner Frage: Wenn der ScreenSaver in einem separaten Desktop läuft, müsste es doch theoretisch möglich sein, einen Screenshot vom anderen Dekstop (also der den der Benutzer hat) zu machen, ohne den Screensaver überhaupt anfassen zu müssen. Oder sehe ich das falsch? Soll ich dazu ein neues Them aufmachen?

Gruß, Alex

Teekeks 11. Sep 2010 15:07

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Zitat:

Zitat von Schwedenbitter (Beitrag 1048863)
Er soll meine "Bildschirme schonen", wie der Name schon sagt.

Das ist mal absoluter Quatsch.
Zur Zeit der Röhren-Monitore waren die Bildschirmschoner dazu da, das sich kein Bild einbrennt.
Aber da ich jetzt mal davon ausgehe das du keinen Röhren-Monitor hast, dienen Bildschirmschoner nur der Zierde.
Einen praktischen Nutzen haben diese dort nicht.

zeras 11. Sep 2010 15:10

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Zitat:

Zitat von Teekeks (Beitrag 1048908)
Zitat:

Zitat von Schwedenbitter (Beitrag 1048863)
Er soll meine "Bildschirme schonen", wie der Name schon sagt.

Das ist mal absoluter Quatsch.
...
Einen praktischen Nutzen haben diese dort nicht.

Wenn man nicht noch bunte Bilder als Schoner nimmt, sondern komplett dunkel, dann spart man vielleicht noch ein wenig Energie. Auch die Elemente, die die Helligkeit erzeugen, unterliegen einer Alterung (kleine Leuchstoffröhren an den Seiten der Display oder auch LED's unterliegen der Alterung.

mkinzler 11. Sep 2010 15:11

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Dann wäre/ist das Abschalten des Bildschirms aber die bessere Alternative

Schwedenbitter 11. Sep 2010 18:41

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von mkinzler (Beitrag 1048910)
Dann wäre/ist das Abschalten des Bildschirms aber die bessere Alternative

Das stimmt. Aber die Mädels (meine Mitarbeiterinnen) finden es toll. Dazu gehört auch das wöchentliche Wechseln des Hintergrundbildes etc. pp.
Ich habe jetzt das hier übersetzt und es funktioniert im Grunde auch ganz gut. Aber vielleicht könnten die Profis hier mal drüberschauen, ob irgend welche groben Schnitzer drin sind. FastMM meldet jedenfalls keine memory leaks. Den vollständigen Code zum Test nebst Testprogramm habe ich als Anhang begefügt.

Delphi-Quellcode:
Procedure QuitScreenSaver;

  Function KillScreenSaverFunc(Wnd: HWnd; LParam: Word): Boolean;
  Begin
    If (IsWindowVisible(Wnd)) Then
        PostMessage(Wnd, WM_CLOSE, 0, 0);
    Result:=True;
  End;

Var
  hDesktop   : hDesk;
Begin
  hDesktop:=OpenDesktop('Screen-saver', 0, False,
      DESKTOP_READOBJECTS Or DESKTOP_WRITEOBJECTS);
  If (hDesktop <> 0) Then
  Begin
    EnumDesktopWindows(hDesktop, @KillScreenSaverFunc, 0);
    CloseDesktop(hDesktop);
  End
  Else // <- Windows 2000 and later
    PostMessage(GetForeGroundWindow, WM_Close, 0, 0);
End;
Eine Sache gefällt mir allerdings noch nicht so ganz: Obwohl ich auf das Beenden des Bildschirmschoners warte, bekomme ich manchmal nur ein halbes oder verschwommenes Bild. Kann man das noch irgendwie eleganter/besser machen?

Gruß & Dank, Alex

haentschman 11. Sep 2010 19:16

AW: Re: Bildschirmschoner beenden aus Delphi-Anwendung
 
Zitat:

Zitat von himitsu (Beitrag 873694)
Der Bildschirmschoner entscheidet doch selber auf was er, zum Beenden, reagiert.
Meißt ist das die Bewegung des Mauszeigers, oder ein Tastendruck.
Per SendKey und Co. könnte man dann auch etwas erreichen.

...ich zitiere mal himitsu aus dem Jahre 2009. Sollte nicht ein "Tastendruck simulieren" reichen ? :gruebel:

SirThornberry 13. Sep 2010 12:35

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Eventuell hilft einfach den Mauscursor per Api-Funktion (setcursorpos) zu bewegen oder zum Beispiel einen Tastendruck zu simulieren um den Bildschirmschoner zu deaktivieren.

Satty67 13. Sep 2010 14:16

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Also ist ja ganz schnell getestet:

Delphi-Quellcode:
Windows.SetCursorPos(0,0);
Windows.SetCursorPos(200,200);
.
beendet unter Windows XP (No Admin) den laufenden Bildschirmschoner

xZise 13. Sep 2010 14:18

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Zitat:

Zitat von Satty67 (Beitrag 1049284)
Also ist ja ganz schnell getestet:

Delphi-Quellcode:
Windows.SetCursorPos(0,0);
Windows.SetCursorPos(200,200);
.
beendet unter Windows XP (No Admin) den laufenden Bildschirmschoner

Sicher? Ich kenne einen Bildschirmschoner, wo man mit der Maus über die Länder gehen konnte um die lokale Uhrzeit anzuzeigen.

MfG
Fabian


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 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