Delphi-PRAXiS

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)

grips-net 3. Mär 2008 07:30


Bildschirmschoner beenden aus Delphi-Anwendung
 
Hallo!

Ich nutze bei einer von mir erstellten Software als Benutzer-Authentifizierung einen Smartcard-Reader. Einige User haben nun einen Bildschrimschoner installiert. Daher kommt es zu dem Problem, dass dieser beim Einlegen der Karte nicht automatisch beendet wird und die veränderte Anzeige der Software nicht direkt sichtbar ist. (wie) Kann ich in meinem Ereignis "Karte eingelegt" den Bildschirmschoner zwangs-beenden?

...und bevor mir jemand die Such-Funktion erklärt:
Delphi-Quellcode:
  SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0);
liefert leider nicht das gewünschte Ergebnis. Der Bildschirmschonder bleibt trotzdem aktiv. (WinXP)


Danke und schöne Grüße aus dem Saarland


Michael

MisterNiceGuy 27. Jan 2009 11:09

Re: Bildschirmschoner beenden aus Delphi-Anwendung
 
Der Vollständigkeit halber:

Delphi-Quellcode:
begin
  windows.SetCursorPos(screen.width div 2,screen.height div 2);
end;
Ist aber ungetestet!

himitsu 27. Jan 2009 11:21

Re: Bildschirmschoner beenden aus Delphi-Anwendung
 
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.

turboPASCAL 27. Jan 2009 12:18

Re: Bildschirmschoner beenden aus Delphi-Anwendung
 
Verwende einfach Sendmessage und WM_CLOSE bzw. WM_QUIT (wenn das Teil richtig programiert wurde). ;)

himitsu 27. Jan 2009 12:22

Re: Bildschirmschoner beenden aus Delphi-Anwendung
 
Zitat:

Zitat von turboPASCAL
Verwende einfach Sendmessage und WM_CLOSE bzw. WM_QUIT (wenn das Teil richtig programiert wurde). ;)

Dafür muß man aber erstmal irgendwie den Bildschirmschoner finden (bzw. dessen Fenster) um dem was zu senden.

turboPASCAL 27. Jan 2009 12:27

Re: Bildschirmschoner beenden aus Delphi-Anwendung
 
Das sollte sich im Vordergrund befinden, also das erste was man sieht. :mrgreen:

himitsu 27. Jan 2009 12:37

Re: Bildschirmschoner beenden aus Delphi-Anwendung
 
nöö, bei mir ist auch mal was anderes im Vordergrund ... z.B. das Statusfenster vom Defragmentierer :oops:

aber egal, ich hab eh keinen Bildschirmschoner installiert

turboPASCAL 27. Jan 2009 23:01

Re: Bildschirmschoner beenden aus Delphi-Anwendung
 
Ich auch nicht.

Gab's da nicht eine API Message wenn so ein Teil started bzw irgend etwas in dieser Richtung ? :gruebel:

Schwedenbitter 11. Sep 2010 08:34

AW: Re: Bildschirmschoner beenden aus Delphi-Anwendung
 
Hallo,

falls Ihr eine Lösung habt, könntet Ihr diese bitte mal posten?

Ich habe folgendes Problem: Ich administriere mehrere PC. So werfe ich z.B. des öfteren einen Defragmentierer an und gehe zum nächsten Rechner. Auf allen Rechnern laufen Bildschirmschoner und mein in Delphi geschriebenes Programm. Ich kann mir dann von meiner Server Application aus jeweils Screenshots holen. Wenn ich sehe, dass z.B. Defrag fertig ist, kann ich dann den Rechner über mein Programm auch runterfahren.
Wenn aber der Bildschirmschoner aktiv ist, bekomme ich nur ein Bild von diesem und nicht vom Desktop. Ich sehe also nicht, ob das gestartete Programm fertig ist :( Hierzu muss/will ich den Bildschirmschoner ausschalten; notfalls auch nur kurz.

Um (Vor)Urteile auszuräumen: Ich spioniere niemanden aus. Wenn das so wäre, hätte ich kein Problem mit dem Bildschirmschoner. Denn der wäre nicht aktiv, wenn ein Benutzer davor säße und am PC arbeitete. Und ich vertraue auch nicht der Fernwartung von MS.

Mich interessiert daher stark, wie das nun wirklich geht mit dem deaktivieren des Bildschirmschoners.

Alternativ würde mir auch eine Lösung helfen, die mir das Bild hinter dem Schoner (also den Desktop) liefert ...
[edit]
Achso: Probiert habe ich bereits die Vorschläge von grips-net im ersten und von MisterNiceGuy im zweiten Post. Von SendMessage habe ich aus den genannten Gründe abgesehen. Meistens geht es bei mir gerade um den Defragmentierer. Den würde ich nur ungern abschießen!
[/edit]

Gruß & Danke, Alex

turboPASCAL 11. Sep 2010 09:06

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Moin,

ggf. hilft dir das: Bildschirmschoner unterdrücken

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

Satty67 13. Sep 2010 14:36

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Das ist ja dann schon mehr eine Application und kein Bildschirmschoner mehr :wink:

Kann ich aber auch nicht testen, mehr als den Standard was mit XP ausgeliefert wird, habe ich hier nicht. Notfalls zusätzlich eigenes Fenster in den Fordergrund und eine unbedenkliche Taste ans fenster senden.

Microsoft schreibt, dass man das ForeGroundWindow beenden soll... finde ich nur witzig, wenn das gerade mal nicht der Bildschirmschoner ist.

SirThornberry 13. Sep 2010 16:20

AW: Bildschirmschoner beenden aus Delphi-Anwendung
 
Es kommt eben darauf an was für ein Bildschirmschoner im Einsatz ist. Denn ein Bildschirmschoner ist letztendlich nichts anderes als eine Exe die man umbenannt hat und die auf bestimmte Parameter reagiert. Aber bei den "normalen" Bildschirmschonern genügt eine Eingabe per Tastatur oder Zeigergerät um diesen zu beenden.


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