Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht (https://www.delphipraxis.net/179424-bildschirmschoner-unterdruecken-win7-8-mal-gehts-mal-nicht.html)

Andreas2k 6. Mär 2014 12:04


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?


-

alleinherrscher 6. Mär 2014 12:41

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.

hathor 6. Mär 2014 14:13

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:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

ASM 6. Mär 2014 14:43

AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
 
Etwas professioneller und - hoffentlich - auch zuverlässiger sollte es so gehen:
Delphi-Quellcode:
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;
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.

himitsu 6. Mär 2014 15:15

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)

ASM 6. Mär 2014 15:41

AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
 
Zitat:

Zitat von himitsu (Beitrag 1250941)
Dort ist doch aus Sicherheitsgründen der Bildschirmschoner an?

Beziehst Du das auf meinen Vorschlag ?

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.

himitsu 6. Mär 2014 16:48

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.

Andreas2k 6. Mär 2014 23:26

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.

Namenloser 7. Mär 2014 02:45

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.

hathor 7. Mär 2014 09:36

AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
 
Schon mal über ADMIN-RECHTE nachgedacht?

(Alles sehr merkwürdig...)

Puke 7. Mär 2014 22:24

AW: Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht
 
Die Man nur alle 10 min hat?
Bezweifel ich ...


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