![]() |
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:
liefert leider nicht das gewünschte Ergebnis. Der Bildschirmschonder bleibt trotzdem aktiv. (WinXP)
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0);
Danke und schöne Grüße aus dem Saarland Michael |
Re: Bildschirmschoner beenden aus Delphi-Anwendung
Der Vollständigkeit halber:
Delphi-Quellcode:
Ist aber ungetestet!
begin
windows.SetCursorPos(screen.width div 2,screen.height div 2); end; |
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. |
Re: Bildschirmschoner beenden aus Delphi-Anwendung
Verwende einfach Sendmessage und WM_CLOSE bzw. WM_QUIT (wenn das Teil richtig programiert wurde). ;)
|
Re: Bildschirmschoner beenden aus Delphi-Anwendung
Zitat:
|
Re: Bildschirmschoner beenden aus Delphi-Anwendung
Das sollte sich im Vordergrund befinden, also das erste was man sieht. :mrgreen:
|
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 |
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: |
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 |
AW: Bildschirmschoner beenden aus Delphi-Anwendung
|
AW: Bildschirmschoner beenden aus Delphi-Anwendung
Zitat:
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:
einen einmal laufenden Bildschirmschoner eben nicht beendet. Wäre auch zu einfach und schön gewesen :lol:
SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0);
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 |
AW: Bildschirmschoner beenden aus Delphi-Anwendung
Ich haber vermutlich
![]() 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 |
AW: Bildschirmschoner beenden aus Delphi-Anwendung
Zitat:
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. |
AW: Bildschirmschoner beenden aus Delphi-Anwendung
Zitat:
|
AW: Bildschirmschoner beenden aus Delphi-Anwendung
Dann wäre/ist das Abschalten des Bildschirms aber die bessere Alternative
|
AW: Bildschirmschoner beenden aus Delphi-Anwendung
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Ich habe jetzt ![]()
Delphi-Quellcode:
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?
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; Gruß & Dank, Alex |
AW: Re: Bildschirmschoner beenden aus Delphi-Anwendung
Zitat:
|
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.
|
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 |
AW: Bildschirmschoner beenden aus Delphi-Anwendung
Zitat:
MfG Fabian |
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. |
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 17:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz