![]() |
Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
Folgendes Problem:
Ich habe eine Anwendung geschrieben wo der Nutzer den Screensaver temporär ab- und dann wieder anschalten kann um kritische Prozesse verfolgen zu können. Zum abschalten rufe ich SystemParametersInfo wie folgt auf SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0); zum wieder einschalten SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, nil, 0); Soweit so gut. Leider funktioniert es nur manchmal und nicht immer! Zum Testen habe ich auf meinem Win7 und Win8.1 Laptop den Bildschirmschoner auf 1 Minute gestellt. Manchmal funktioniert es und der Bidlschirmschoner bleibt wirklich aus. Versuche ich es ein paar Minuten später noch einmal geht es plötzlich nicht mehr und der Bildschirmschoner geht nach einer Minute dennoch an. Ich habe bisher nicht herausgefunden warum es mal klappt und dann wieder nicht! Die Funktion SystemParametersInfo gibt immer einen Bool von -1 zurück - laut Hilfe gilt alles außer 0 als erflgreich (true). Ach ja. Der Bildschirmschoner ist so eingestellt das beim reaktivieren der Nutzer sein Passwort eingeben muss - daher ist die temporäre deaktivierung des Bildschirmschoners auch so wichtig! Was also mache ich falsch bzw. wie kann ich den Bildschirmschoner 100% sicher unterdrücken? - |
AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
Ich weiß, der Ansatz ist vielleicht nicht so professionell, läuft bei mir aber wunderbar: Ich bewege via Programm die Maus um 1 Pixel hin und wieder zurück.
|
AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
Lastinput muss man resetten - entweder im normalen Programmablauf oder mit einem Timer:
Delphi-Quellcode:
.
keybd_event(0, 0, 0, 0); //Reset LastInput
INFO: ![]() |
AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
Etwas professioneller und - hoffentlich - auch zuverlässiger sollte es so gehen:
Delphi-Quellcode:
Falls die Inaktivierung des Screensavers nicht während der gesamten Laufzeit des eigenen Programms ausgelöst sein soll, sondern nur sporadisch über bestimmte Abläufe innerhalb des Programms, dann kann diese Feinsteuerung mittels einer zusätzlich eingeführten Variablen gesteuert werden. Die muss dann in der Methode AppMessage() ergänzend abgefragt werden, um den dortigen Parameter 'handled' entsprechend zu belegen.
type
TForm1 = class(TForm) {...} private procedure AppMessage(var msg: TMsg; var handled: boolean); {...} end; procedure TForm1.FormCreate(Sender: TObject); begin Application.OnMessage := AppMessage; end; procedure TForm1.AppMessage(var msg: TMsg; var handled: boolean); begin if (msg.message = WM_SYSCOMMAND) and (msg.wparam = SC_SCREENSAVE) then handled := true; end; |
AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
Dort ist doch aus Sicherheitsgründen der Bildschirmschoner an?
Lösung: Du schreibst einen Bildschirmschoner, welcher auf dem zu schonenden Bildschirm die gewünschten Statusinfos anzeigt. (und vielleicht auch noch das Firmenlogo und paar bunte bewegte Linien drumrum) |
AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
Zitat:
Falls ja, verstehe ich das eingangs beschriebene Problem jedenfalls aber so, dass der Bildschirmschoner während der Laufzeit des eigenen Programms nur temporär bzw. sporadisch nicht wirksam werden soll, vor allem deswegen, weil ansonsten beim Wegklicken des Bildschirmschoners jedes Mal erst ein Passwort eingegeben werden muss. Mit dem von mir vorgeschlagenen Code wird der Bildschormschoner gar nicht erst optisch wirksam, weil seine zeitabhängige Reaktivierung abgefangen wird. Der Screen, d.h. die Oberfläche des eigenen Programms, ist durchgängig im Blick des Benutzers, solange dies temporär so gewünscht ist. Ein ständiger Switch zwischen absoluter Ab- und Wiedereinschaltung des Bildschirmschoners, was offenbar das Problem verursacht, ist also nicht notwendig. Ich denke, die Steuerung über die Behandlung der Message des Systems im OnMessage-Event ist genau das, was Andreas2k zur Lösung seines Problems zweckmäßig und optimal einsetzen kann. |
AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
Wenn der Bildschirmschoner aber schon das Wichtigste anzeigt und die nur mal kurz gucken wollen, ob noch alles läuft, dann braucht man auch nichst mehr machen.
Nja, viele Wege, noch mehr Ziele und nun muß man sich nur noch entscheiden was wirklich gebraucht wird. |
AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
Es geht nicht darum irgendwelche Informationen zu sehen sondern vielmehr darum zu reagieren wenn was passiert und da ist es eben sehr unpraktisch wenn man sich erst mal wieder einloggen muss. Außerdem ist es nicht mein Programm was im Vordergrund steht sondern vielmehr andere Prozesse die mein Programm aufruft.
Mein Programm befindet sich i.d.R. ohne sichtbares Fenster in der Systray. Die Sache mit den Messages habe ich auch schon probiert bevor ich auf SystemParametersInfo gestoßen bin. Leider funktioniert das mit den Messages unter Windows 7 / 8 nicht. Zwar reagiert mein Programm auf die Message SC_SCREENSAVE aber wenn ich die Message behandle geht der Screensaver dennoch an! Ich habe auch mal irgendwo gelesen das man seit Windows Vista den Screensaver nicht mehr per WMSysCommand unterdrücken kann. Zumindest hat das bei mir nicht funktioniert. Was ich brauche ist eine Möglichkeit den Screensaver sicher zu unterdrücken wenn ich das brauche ohne das mein Programm/Fenster den Fokus hat(läuft im Hintergrund/Systray), und ohne das irgendwelche Nutzeraktionen simuliert werden(Tastendruck, Mausbewegung etc) was den Nutzer evtl. bei der Arbeit stört. Es sollten keine Änderungen am System vorgenommen werden (Registry etc.) Und es sollte funktionieren auch wenn mein Programm ohne Adminrechte läuft. Bisher hat es wie gesagt nur mit SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0); funktioniert, aber auch da nicht 100%ig zuverlässig da Screensaver ab und zu dennoch angezeigt wurde obwohl erfolgreich deaktiviert wurde. |
AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
Kann es nicht sein, dass irgendein anderes Programm dazwischenfunkt? Vielleicht die Routine zum Deaktivieren des Bildschirmschoners einfach periodisch aufrufen, alle 10 Sekunden oder so.
|
AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
Schon mal über ADMIN-RECHTE nachgedacht?
(Alles sehr merkwürdig...) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:44 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-2025 by Thomas Breitkreuz