AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Bildschirmschoner unterdrücken (Win7/8) - mal gehts mal nicht

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

Ein Thema von Andreas2k · begonnen am 6. Mär 2014 · letzter Beitrag vom 7. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2   
Andreas2k

Registriert seit: 2. Jan 2003
108 Beiträge
 
Delphi XE5 Professional
 
#1

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

  Alt 6. Mär 2014, 12:04
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?


-
Andreas

Geändert von Andreas2k ( 6. Mär 2014 um 12:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#2

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

  Alt 6. Mär 2014, 12:41
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.
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#3

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

  Alt 6. Mär 2014, 14:13
Lastinput muss man resetten - entweder im normalen Programmablauf oder mit einem Timer:

keybd_event(0, 0, 0, 0); //Reset LastInput .
INFO:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

Geändert von hathor ( 6. Mär 2014 um 16:11 Uhr)
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#4

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

  Alt 6. Mär 2014, 14:43
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.709 Beiträge
 
Delphi 10.4 Sydney
 
#5

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

  Alt 6. Mär 2014, 15:15
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
ASM

Registriert seit: 16. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#6

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

  Alt 6. Mär 2014, 15:41
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.709 Beiträge
 
Delphi 10.4 Sydney
 
#7

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

  Alt 6. Mär 2014, 16:48
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Andreas2k

Registriert seit: 2. Jan 2003
108 Beiträge
 
Delphi XE5 Professional
 
#8

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

  Alt 6. Mär 2014, 23:26
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.
Andreas
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#9

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

  Alt 7. Mär 2014, 02:45
Kann es nicht sein, dass irgendein anderes Programm dazwischenfunkt? Vielleicht die Routine zum Deaktivieren des Bildschirmschoners einfach periodisch aufrufen, alle 10 Sekunden oder so.
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#10

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

  Alt 7. Mär 2014, 09:36
Schon mal über ADMIN-RECHTE nachgedacht?

(Alles sehr merkwürdig...)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf