Delphi-PRAXiS
Seite 2 von 2     12   

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 8. Mai 2017 14:08

AW: Bildschirmsperre verhindern?
 
Zitat:

Zitat von t.roller (Beitrag 1370356)
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;

in die Routine wird hineingesprungen, allerdings geht die Sperre trotzdem rein. Ich seh das Ergebnis (in deinem Fall das rote LPanel) aber erst nach dem Entsperren.


Zitat:

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;

Das hatte ich auch probiert, aber aus mir unerfindlichen Gründen wird nicht in die Prozedure gesprungen. Keine Ahnung warum das so ist.


Ich suche jetzt mal nach PowerCreateRequest, hoffentlich funktionierts damit. Danke

t.roller 8. Mai 2017 14:32

AW: Bildschirmsperre verhindern?
 
Neuer Versuch (funktioniert mit WIN8.1)
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
if (msg.wparam = SC_SCREENSAVE) then
    begin
        Msg.wParam := 0;
        keybd_event(0,0,0,0); // simuliert Tastendruck
        Panel1.Color:= clRed; //nur Anzeige, dass Routine durchlaufen wird
        Handled := true;
    end;
end;

HolgerX 8. Mai 2017 14:37

AW: Bildschirmsperre verhindern?
 
Hmm..

Zitat:

Zitat von t.roller (Beitrag 1370581)
Neuer Versuch (funktioniert mit WIN8.1)
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
if (msg.wparam = SC_SCREENSAVE) then
    begin
        Msg.wParam := 0;
        keybd_event(0,0,0,0); // simuliert Tastendruck
        Panel1.Color:= clRed; //nur Anzeige, dass Routine durchlaufen wird
        Handled := true;
    end;
end;


Das mag (vielleicht) den ScreenSaver aufhalten, jedoch nicht die Benutzerabmeldung!

news2swen 8. Mai 2017 15:38

AW: Bildschirmsperre verhindern?
 
Zitat:

Zitat von HolgerX (Beitrag 1370584)
Hmm..

Zitat:

Zitat von t.roller (Beitrag 1370581)
Neuer Versuch (funktioniert mit WIN8.1)
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
if (msg.wparam = SC_SCREENSAVE) then
    begin
        Msg.wParam := 0;
        keybd_event(0,0,0,0); // simuliert Tastendruck
        Panel1.Color:= clRed; //nur Anzeige, dass Routine durchlaufen wird
        Handled := true;
    end;
end;


Das mag (vielleicht) den ScreenSaver aufhalten, jedoch nicht die Benutzerabmeldung!


Da hat HolgerX leider Recht. Scheinbar ist sämtliche Aktivität zu diesem Zeitpunkt zu spät, um die Sperre noch verhindern zu können.

Das Thema PowerCreateRequest erschliesst sich mir leider nicht. Ich finde nichts, wie ich dies in Delphi anwenden könnte :(

Ich habe mir erstmal mit einem Timer (alle 30 Sekunden) beholfen, welcher einen Tastendruck simuliert "keybd_event(0,0,0,0);". Danke an t.roller diese Zeile

t.roller 8. Mai 2017 16:27

AW: Bildschirmsperre verhindern?
 
Wenn ein Timer läuft, kann man das Resetten des LastInput-Wertes interessanter gestalten:
Delphi-Quellcode:
function LastInput: DWord;
var
  LInput: TLastInputInfo;
begin
  LInput.cbSize := SizeOf(TLastInputInfo);
  GetLastInputInfo(LInput);
  Result := GetTickCount - LInput.dwTime;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin // Timer1.Interval:= 1000;
  Label1.Caption:= INTTOSTR(LastInput);
  if LastInput>60000 then // 60sec
    keybd_event(0,0,0,0);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 Uhr.
Seite 2 von 2     12   

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