Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Screensaver verhindern, wenn Fenster nicht den Fokus hat (https://www.delphipraxis.net/74317-screensaver-verhindern-wenn-fenster-nicht-den-fokus-hat.html)

Mutier 1. Aug 2006 11:13


Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Hallo,

ich habe ein kleines Programm erschienen, dessen MainForm ständig auf dem Bildschirm zu sehen ist, das jedoch nicht den Fokus hat. Wie kann ich verhindern, dass der Screensaver anspringt bzw. der Monitor in den Powersave-Modus geht? Die im Forum vorgeschlagenen Methoden (u.a. Systemnachrichten abfangen und in eigener Appmessage verarbeiten) funktionieren ja leider nur dann, wenn mein Form den Fokus hat. Das zwischenzeitliche komplette Abschalten kommt auch nicht in Frage, da ja dann immernoch die "Powersave-Uhr" ticken würde...

Muss man in meinem Fall dann einen Hook für Systemnachrichten einsetzen? Oder gibt es eine einfachere Möglichkeit?

Danke für Eure Hilfe!
Ciao
Mutier

ManuMF 1. Aug 2006 15:20

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Soweit ich es verstanden habe, funktioniert die Methode aus meinem CodeLib-Vorschlag auch ohne Fokus - schon probiert?

himitsu 1. Aug 2006 15:50

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Solche Nachrichten werden an alle Fenster geschickt und nur wenn alle nichts dagegen haben, dann wird es ausgeführt.

Also nur wenn alle Programme mit 0 Antworten, bzw. das Result unverändert lassen, oder die Nachricht garnicht erst behandeln dann wirdder Screensaver ausgeführt ... oder anders gesagt, sobald auch nur ein einiges Programm, egal ob Aktiv, oder nicht, mit 1 antwortet, bleibt der SS aus.

Hat Robert aber auch nochmal gesagt :)
Zitat:

Zitat von Robert Marquardt
Windows sendet jedesmal wenn der Screensaver anspringen soll eine WMSYSCOMMAND mit Parameter SC_SCREENSAVE an alle Applikationen.


Mutier 1. Aug 2006 16:38

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Jau, das habe ich ausprobiert. Hat mein Fenster den Fokus, wird der Schoner erfolgreich verhindert. Ist mein Fenster sichtbar, aber ohne Fokus, springt der Schoner an. :(

Nochmal 'ne kurze Beschreibung der Ausgangslage: Nach dem Start meines kleinen Tools wird per createprocess ein zweites Programm gestartet, aus dem via Indy Daten ausgelesen werden, die dann in meinem Fenster grafisch dargestellt werden. Dabei teilen sich beide Fenster den Desktop, wobei mein Tool zwar sichtbar ist, jedoch nicht den Fokus hat.

Ciao
Mutier

Mutier 4. Aug 2006 11:13

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
...*nach oben schieb*

Hat niemand 'ne Idee? Bin ich der einzigste, bei dem der Code den Schoner nicht zuverlässig unterdrückt?

Ciao Mutier

ManuMF 4. Aug 2006 20:49

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Das mit Application.onMessage hat wohl nicht geklappt, aber die neue Version mit Form.WMSYSCOMMAND sollte laut Robert Marquardt funktionieren. :gruebel:

Mutier 4. Aug 2006 21:04

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Hi,

leider funktionieren alle Code-Vorschläge, die diesbzgl. im Forum/in der Codelib auftauchen, bei mir nicht. Das heißt, sobald mein Fenster nicht mehr den Fokus hat, springt der Schoner nach der entsprechenden Zeit an. :( Ich kann es mir auch nicht erklären. Offensichtlich scheint es ja bei allen anderen zu funtionieren.

Ciao
Mutier

ManuMF 4. Aug 2006 21:19

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
[Für das CodeLib-Beispiel] Probier doch mal, ob die Message überhaupt ankommt, d.h. schreibe statt Msg.Result := 1 zum Beispiel ShowMessage('Nachricht!') oder was anderes. Wenn das nicht der Fall ist, müsste es theoretisch wirklich am Fokus liegen. Das wäre jedoch seltwürdig - oder merksam? ;-)

Mutier 4. Aug 2006 21:41

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
... das war 'ne gute Idee. :) Ergebnis: Die Message kommt nur dann an, wenn das Fenster den Fokus hat.

Edit:
Ich habe es eben nochmal mit 'nem jungfräulichen Form ausprobiert, um etwaige Abhängigkeiten/Unstimmigkeiten in meinem Programm auszuschließen. Am Ergebnis hat sich nix getan. Es kann also eigentlich nicht sein, dass Windows die Nachricht an alle Fenster schickt. Getestet mit folgendem Code:

Code:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
      procedure WMSysCommand(var Msg: TMessage); message WM_SYSCOMMAND;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
// Mit folgender Zeile wird die Prozedur im Hauptforumlar deklariert:


// Und hier dann das Unterdrücken:
procedure TForm1.WMSysCommand(var Msg: TMessage);
begin
  if (Msg.wParam = SC_SCREENSAVE) then
    begin
      Msg.Result := 1;
      showmessage('Da kommt was an...')
    end
  else
    inherited;
end;

end.
Ciao
Mutier

Nicolai1234 4. Aug 2006 21:52

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
sorry, zu spät für mich :oops:

ManuMF 5. Aug 2006 11:35

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Habe es getestet, funktioniert tatsächlich nur bei Fokus :gruebel:

himitsu 5. Aug 2006 11:47

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
wäre aber eigenartig, wenndas wirklich nur an die aktive Form gesendet würde :gruebel:

liegt das viellleich irgendwie an der Nachrichtenschleife, in die ihr euch hier eingeschleußt habt?

Mutier 7. Aug 2006 09:36

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Ich schieb' das Topic nochmal hoch. Vielleicht schaut ja nochmal ein D.-Crack drauf.

Aufgabenstellung:
Abwürgen des Screensavers und des Monitor-Standbys, wenn das eigene Form nicht den Fokus hat.Der Code in Posting #9 wird in verschiedenen DP-Threads und anderswo im Netz als Lösung vorgschlagen, funktioniert jedoch nur dann, wenn das eigene Fenster den Fokus hat.

Danke für Eure Hilfe!

Ciao
Mutier

marabu 7. Aug 2006 10:33

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Hallo,

vielleicht doch noch ein paar klärende Worte zu meinen indirekt zitierten Beiträgen: Windows startet den konfigurierten Bildschirmschoner bei entsprechender Idle-Time, indem es dem gerade im Vordergrund befindlichen Fenster die Message WM_SYSCOMMAND mit dem Parameter SC_SCREENSAVE schickt. Lässt dieses Fenster die Nachricht von DefWindowProc behandeln, dann wird effektiv dort der Bildschirmschoner aktiviert. Für nicht aktive Fenster bleibt da nur die vorübergehende Deaktivierung über SystemParametersInfo(). Ich halte das für völlig ausreichend. Das Argument "bloß nicht, mein Programm könnte abstürzen und dann ..." finde ich denkwürdig. Ist die Anwendung so labil, dann möchte ich sie vielleicht garnicht auf meinem Rechner haben - und wenn doch, dann werde ich den Bildschirmschoner halt per Hand wieder aktivieren.

Grüße vom marabu

Mutier 7. Aug 2006 10:37

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Hi,

ich kann's hier gerade nicht testen. Weißt Du, ob durch die vorübergehende Aktivierung des Screensavers auch die Standby-Funktion des Monitors ausgeschaltet wird?

Ciao
Mutier

marabu 7. Aug 2006 11:05

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Ich will bei MS grundsätzlich nichts ausschließen, aber ich würde mich sehr wundern, wenn da ein Zusammenhang bestehen würde.

marabu

Mutier 7. Aug 2006 11:07

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
... lol. :)

Topic: Das hatte ich mir schon gedacht. Vielen Dank!

Ciao
Mutier

Mutier 13. Aug 2006 07:03

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
... in den Postings #8 und #9 eines anderen Threads findet Ihr eine Methode, die den Bildschirmschoner zuverlässig unterdrückt, ohne dass man ihn temp. komplett abschalten muss.

Ciao
Mutier

Luckie 26. Aug 2006 17:34

Re: Screensaver verhindern, wenn Fenster nicht den Fokus hat
 
Zitat:

Zitat von Mutier
Delphi-Quellcode:
procedure TForm1.WMSysCommand(var Msg: TMessage);
begin
  inherited;
  if (Msg.wParam = SC_SCREENSAVE) then
    begin
      Msg.Result := 1;
      showmessage('Da kommt was an...')
    end
end;

So müsste es eigentlich heißen, denke ich.


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