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/)
-   -   Timer des Bildschirmschoners zurücksetzen (https://www.delphipraxis.net/169862-timer-des-bildschirmschoners-zuruecksetzen.html)

Breager 16. Aug 2012 18:23

Timer des Bildschirmschoners zurücksetzen
 
Hallo,

ich befürchte zwar, dass mir niemand diese Frage beantworten kann, aber einen Versuch ist es vielleicht doch wert.

Meine Anwendung lässt sich über einen Joystick steuern und auch beenden. Das Starten des Bildschirmschoners unterdrücke ich erfolgreich mit folgenden Zeilen Code:
Delphi-Quellcode:
procedure TForm1.WMSysCommand(var Msg: TMessage);
begin
  IF (Msg.wParam = SC_SCREENSAVE) OR (Msg.WParam = SC_MONITORPOWER) then
      Msg.Result := 1 else
      inherited;
end;
Sobald ich jedoch meine Anwendung beende, startet der Bildschirmschoner, da das Timeout abgelaufen ist und nicht zurückgesetzt wird. Ein Simulieren des Tastendrucks oder einer Mouse-Bewegung bringt leider nicht den gewünschten Erfolg, und zwar anscheinend aus folgendem Grund:

Zitat:

SPI_GETBLOCKSENDINPUTRESETS
Retrieves a BOOL indicating if an application can reset the screensaver's timer by calling the SendInput function to simulate keyboard or mouse input. The pvParam parameter must point to a BOOL variable that receives TRUE if the simulated input will be blocked, or FALSE otherwise.
Leider kennt mein Delphi die Konstante SPI_SETBLOCKSENDINPUTRESETS, mit der ich wohl diese Einstellung ändern kann, nicht.

P.S.: In der Online-Hilfe von Delphi steht als Konstante SPI_SETBLOCKSENDINPUTREQUESTS, ich bin mir jedoch sehr sicher, dass das ein Schreibfehler ist.

Hat vielleicht jemand einen Tipp für mich? Nutze Delphi 2005 PE und Vista. Kein gravierendes Problem, aber einfach nervig, wenn ich die Anwendung beende und der Bildschirmschoner springt an.

Viele Grüße

himitsu 16. Aug 2012 18:30

AW: Timer des Bildschirmschoners zurücksetzen
 
Zitat:

Leider kennt mein Delphi die Konstante SPI_SETBLOCKSENDINPUTRESETS, ..., nicht.
Dann schau doch im MSDN nach, welchen Wert sie hat?

OK, nicht von AAllem ist der Wert da aufgeführt, aber oftmals hilft dann Google und wenn man es direkt vom Hersteller wissen will, dann läd man sich das PSDK runter.
Im Vista-PSDK stehen halle Functionsheader und vorallem auch die Konstanten und ihre Werte drinnen, bzw. es gibt darin die Header-Files der WinAPI, wo das drin steht.

PS: Die Windows.pas ist zu großen Teilen z.B. eine Übersetzung der windows.h (Header-File), welche nie ganz aktuell sein kann.

hathor 16. Aug 2012 18:34

AW: Timer des Bildschirmschoners zurücksetzen
 
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

Lastinput muss man resetten:

Delphi-Quellcode:
keybd_event(0, 0, 0, 0); //Reset LastInput

Breager 17. Aug 2012 00:20

AW: Timer des Bildschirmschoners zurücksetzen
 
Vielen Dank für Eure Antworten!

Das alleinige Resetten von LastInput funktioniert bei mir nicht, der Bildschirmschoner springt trotzdem beim Beenden der Anwendung an.

Zitat:

SPI_GETBLOCKSENDINPUTRESETS 0x1026 :
Retrieves a BOOL indicating whether an application can reset the screensaver's timer by calling the SendInput function to simulate keyboard or mouse input. The pvParam parameter must point to a BOOL variable that receives TRUE if the simulated input will be blocked, or FALSE otherwise.
Folgender Code steht nun bei mir im OnClose-Ereignis der Anwendung:
Delphi-Quellcode:
Const
  SPI_GETBLOCKSENDINPUTRESETS = $1026;
  SPI_SETBLOCKSENDINPUTRESETS = $1027;
Var
  flag :Boolean;
begin

SystemParametersInfo(SPI_GETBLOCKSENDINPUTRESETS, 0,@flag, 0);
SystemParametersInfo(SPI_SETBLOCKSENDINPUTRESETS, Integer(false),nil, 0) ;

keybd_event(0, 0, 0, 0);

SystemParametersInfo(SPI_SETBLOCKSENDINPUTRESETS, Integer(flag),nil,0) ;

end;
Es funktioniert, und das ist ersteinmal positiv. Merkwürdig ist das ganze jedoch schon, denn es funktioniert genauso gut, wenn ich den Wert von SPI_SETBLOCKSENDINPUTRESETS auf True setze und manchmal sogar, wenn ich keinen Code im OnClose-Ereignis stehen habe :shock: Das witzige ist, dass der Bildschirmschoner auch nach einer Weile startet, wenn ich ihn mit SPI_SETSCREENSAVEACTIVE deaktiviere :?

Breager 18. Aug 2012 23:31

AW: Timer des Bildschirmschoners zurücksetzen
 
Vielen dank nochmal an Euch beide! Ziemlich nervig, das zu testen, da ich immer eine gewisse Zeit warten musste. Das Problem ist nun einfach durch ein Setzen des entsprechenden Wertes auf TRUE reproduzierbar. Der Vollständigkeit halber, wie ich das ganze nun letzendlich gelöst habe. Ich denke diese Methode ist besser, als den Bildschirmschoner zu deaktivieren.

Delphi-Quellcode:
public
   procedure WMSysCommand(var Msg: TMessage); message WM_SYSCOMMAND;
...
procedure TForm1.WMSysCommand(var Msg: TMessage);
begin
  IF (Msg.wParam = SC_SCREENSAVE) OR (Msg.WParam = SC_MONITORPOWER) then
      Msg.Result := 1 ELSE
      inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
Const
  SPI_GETBLOCKSENDINPUTRESETS = $1026;
  SPI_SETBLOCKSENDINPUTRESETS = $1027;
Var
  flag :Boolean;
begin
SystemParametersInfo(SPI_GETBLOCKSENDINPUTRESETS, 0,@flag, 0) ;

IF flag then
   SystemParametersInfo(SPI_SETBLOCKSENDINPUTRESETS, Integer(false),nil, 0);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 keybd_event(0, 0, 0, 0);
end;
Die IF-Abfrage ist natürlich nicht zwingend erforderlich. :stupid:

Viele Grüße


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