Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Bildschirmsperre verhindern? (https://www.delphipraxis.net/192624-bildschirmsperre-verhindern.html)

news2swen 5. Mai 2017 15:59

Bildschirmsperre verhindern?
 
Hallo in die Runde

ich möchte gern während mein Programm läuft verhindern, dass sich der Bildschirmschoner aktiviert. Ziel ist es, ein 'Anzeigetool zu programmieren, welches auf Rechnern läuft, welche via Vorgabe von IT-Secure nach 15 Minuten Inaktivität gespertt werden (Bildschirmschonersperre mit Passworteingabe).

Ich habe nach langer Suche immer wieder die gleiche Lösung gefunden, aber die funktioniert leider nicht
Delphi-Quellcode:
procedure THF.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin

    if (msg.message = WM_SYSCOMMAND) and (msg.wparam = SC_SCREENSAVE) then
    begin
       Msg.wParam := 0;
        Msg.message := sc_Move;
        Handled := true;

    end;
   
end;
Die Message kommt zwar an und es wird auch in die Routine gesprungen, allerdings sperrt sich der Bildschirm trotzdem.

Betriebssystem ist Windows 7

Fritzew 5. Mai 2017 16:29

AW: Bildschirmsperre verhindern?
 
MSDN :
Zitat:

If password protection is enabled by policy, the screen saver is started regardless of what an application does with the SC_SCREENSAVE notification
Wenn es eine Vorgabe der / des Admins ist hast Du verloren

t.roller 5. Mai 2017 16:34

AW: Bildschirmsperre verhindern?
 
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
if (msg.wparam = SC_SCREENSAVE) then
    begin
       Msg.wParam := 0;
        SendMessage (0, WM_SYSCOMMAND, SC_SCREENSAVE, -1) ;
        Panel1.Color:= clRed; //nur Anzeige, dass Routine durchlaufen wird
        Handled := true;
    end;
end;
Oder so:
Delphi-Quellcode:
  private
    { Private-Deklarationen }
    procedure WMSysCommand(var Msg: TMessage); message WM_SYSCOMMAND;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMSysCommand(var Msg: TMessage);
begin
Panel1.Color:= clRed; //nur Anzeige, dass Routine durchlaufen wird
  if Msg.wParam = SC_SCREENSAVE then
    Msg.Result := 1
  else
    inherited;
end;

Der schöne Günther 5. Mai 2017 16:48

AW: Bildschirmsperre verhindern?
 
Bildschirmsperre ≠ Bildschirmschoner.

Was du verhindern könntest wäre der evtl. eintretende Standby/Ruhezustand nach x Minuten Leerlauf aber nicht die Systemvorgabe die Session nach einer bestimmten Leerlaufzeit zu sperren.

dummzeuch 5. Mai 2017 17:30

AW: Bildschirmsperre verhindern?
 
Zitat:

Zitat von news2swen (Beitrag 1370350)
ich möchte gern während mein Programm läuft verhindern, dass sich der Bildschirmschoner aktiviert.

Betriebssystem ist Windows 7

Seit Windows 7 funktionieren die alten Methoden nicht mehr. Nur eines tut's noch: Regelmäßiges Simulieren einer Mausbewegung durch
SendInput

Delphi-Quellcode:
procedure JiggleMouse;
var
  Inpt: TInput;
begin
  Inpt.Itype := INPUT_MOUSE;
  Inpt.mi.dx := 0;
  Inpt.mi.dy := 0;
  Inpt.mi.mouseData := 0;
  Inpt.mi.dwFlags := MOUSEEVENTF_MOVE;
  Inpt.mi.Time := 0;
  Inpt.mi.dwExtraInfo := 0;
  SendInput(1, Inpt, SizeOf(Inpt));
end;
(Code aus u_dzOsUtils)

Der schöne Günther 5. Mai 2017 17:34

AW: Bildschirmsperre verhindern?
 
Alter Schwede, das ist aber wirklich ... fies 8-) :twisted:

HolgerX 5. Mai 2017 17:34

AW: Bildschirmsperre verhindern?
 
Hmm..

Die Geschichten mit WMSysCommand( oder (msg.wparam = SC_SCREENSAVE) funktionieren nicht mehr wirklich.

Gerade wenn in ner Domaine per GruppenRichtline die Bildschirmsperre aktiviert wird.


Ab Windows 7 geht dass nur noch mit

PowerCreateRequest
PowerSetRequest
PowerClearRequest

richtig.

Bei Windows XP/2003 gab es

SetThreadExecutionState


Mit beiden Wegen wird dem Betriebssystem mitgeteilt, das hier ein Process/Thread läuft, der nicht unterbrochen werden darf.
Als Parameter kann da neben dem Ruhezustand auch Display-Sperre u.ä. angegeben und verhindert werden.

Hatte da mal eine Unit erstellt, welche die für einen kleinen Videoplayer benutzt hat.
(Nichts ist schlimmer als beim Video schauen immer wieder die Maus zu bewegen.

Alternativ geht das über SentInput, indem du so eine Tastatur-Betätigung simulierst.
Dieses muss dann per Timer immer wieder erfolgen.

himitsu 5. Mai 2017 18:37

AW: Bildschirmsperre verhindern?
 
Zitat:

Zitat von news2swen (Beitrag 1370350)
Delphi-Quellcode:
    if (msg.message = WM_SYSCOMMAND) and (msg.wparam = SC_SCREENSAVE) then
    begin
       Msg.wParam := 0;
        Msg.message := sc_Move;
        Handled := true;
    end;

Das soll jemals funktioniert haben?

Was Interessiert es Windows, ob dein Programm diese Message anders verarbeitet?
Wenn, dann kann und wird Windows maximal auf das Result achten.

Metschu 6. Mai 2017 16:33

AW: Bildschirmsperre verhindern?
 
Hilft das hier eventuell weiter?

*klick*

HolgerX 6. Mai 2017 19:20

AW: Bildschirmsperre verhindern?
 
Hmm...


Zitat:

Zitat von Metschu (Beitrag 1370428)
Hilft das hier eventuell weiter?

*klick*


Wieso ein externes Tool verwenden, wenn es über die API auch direkt richtig geht und dafür seitens Microsoft auch so vorgesehen ist? ;)

Such mal hier im Forum nach

PowerCreateRequest
PowerSetRequest
PowerClearRequest

SetThreadExecutionState

Es sind bereits in Vergangenheit genau diese Punkte bereits besprochen worden...


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr.
Seite 1 von 2  1 2      

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