AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Timer des Bildschirmschoners zurücksetzen

Timer des Bildschirmschoners zurücksetzen

Ein Thema von Breager · begonnen am 16. Aug 2012 · letzter Beitrag vom 18. Aug 2012
Antwort Antwort
Breager

Registriert seit: 18. Feb 2012
40 Beiträge
 
#1

Timer des Bildschirmschoners zurücksetzen

  Alt 16. Aug 2012, 18:23
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
39.664 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Timer des Bildschirmschoners zurücksetzen

  Alt 16. Aug 2012, 18:30
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#3

AW: Timer des Bildschirmschoners zurücksetzen

  Alt 16. Aug 2012, 18:34
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

Lastinput muss man resetten:

keybd_event(0, 0, 0, 0); //Reset LastInput

Geändert von hathor (16. Aug 2012 um 19:01 Uhr)
  Mit Zitat antworten Zitat
Breager

Registriert seit: 18. Feb 2012
40 Beiträge
 
#4

AW: Timer des Bildschirmschoners zurücksetzen

  Alt 17. Aug 2012, 00:20
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 Das witzige ist, dass der Bildschirmschoner auch nach einer Weile startet, wenn ich ihn mit SPI_SETSCREENSAVEACTIVE deaktiviere

Geändert von Breager (17. Aug 2012 um 00:39 Uhr)
  Mit Zitat antworten Zitat
Breager

Registriert seit: 18. Feb 2012
40 Beiträge
 
#5

AW: Timer des Bildschirmschoners zurücksetzen

  Alt 18. Aug 2012, 23:31
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.

Viele Grüße
  Mit Zitat antworten Zitat
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 12:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf