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/)
-   -   Delphi SystemParametersInfo Problem (https://www.delphipraxis.net/78085-systemparametersinfo-problem.html)

sexmagic 28. Sep 2006 19:42


SystemParametersInfo Problem
 
Hallo Jungs,

ich habe mich nun im MSDN umgeshen und habe in der API Referenz SystemParameterInfo gefunden, da hab ich gleich mal bischen rumgetestet und bin auf ein Probelme gestossen.

Vorhaben:
Ich möchte mit einem Programm auf meinem Lappi den Screensaver und ddas EnegryManagement deaktivieren.

Mein Problem:
Ich kann alles deaktivieren, gemacht hab ichs so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  SystemParametersInfo(SPI_SETPOWEROFFACTIVE,1,nil,0);
  SystemParametersInfo(SPI_SETPOWEROFFACTIVE, 1, nil,0);
  Label2.Font.Color := $002DB000;
  Label2.Caption := 'Enabled';
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
  SystemParametersInfo(SPI_SETPOWEROFFACTIVE,0,nil,0);
  SystemParametersInfo(SPI_SETPOWEROFFACTIVE, 0, nil,0);
  Label2.Font.Color := $000000DD;
  Label2.Caption := 'Disabled';
end;
So schalte ich also während der Laufzeit ein und aus.
Laut API habe ich aber gedacht das wenn ich das Programm beende das ding deaktiviert bleibt, wenn ich aber deaktiviere und das Programm neu starte dann is der Status wieder aktiviert.
Habe ich das falsch verstanden und das setzt sich wieder auf True oder hab ich nen Fehler im Code?
Weiters habe ich das Problem das zwar der Dienst deaktiviert wurde aber im Windows unter Systemsteuerungen alles als normal angezeigt wird (aktiv), kann ich diese Anzeige nicht auch umstellen, damit das auch wirklich so angezeigt wird?

Überprüfen tu ich so:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  Value: Integer;
begin
  if SystemParametersInfo(SPI_GETSCREENSAVEACTIVE,0,@Value,0) then
    if Value <> 0 then
    begin
      Label2.Font.Color := $002DB000;
      Label2.Caption := 'Enabled';
    end;

  if SystemParametersInfo(SPI_GETSCREENSAVEACTIVE,0,@Value,0) then
    if Value = 0 then
    begin
      Label2.Font.Color := $000000DD;
      Label2.Caption := 'Disabled';
    end;
end;

Danke für die Hilfe oder Tips

;)

Sunlight7 28. Sep 2006 20:48

Re: SystemParametersInfo Problem
 
Hallo!

Ich nutzte die Funktion, um die Hintergrundbilder zu wechseln, aber da muß das Flag SPIF_UPDATEINIFILE im letztem Paramater hinein, probier das mal, ob das Dein Problem löst. :idea:

sexmagic 28. Sep 2006 21:52

Re: SystemParametersInfo Problem
 
Danke Sunlight, ich habe das getestet, funktioniert leider immernoch nicht richtig.

Wenn ich das Programm beende und neustarte ist der Screensaverdienst wieder Aktiviert obwohl ich nach dem Disablen beendet hab.

Auch hab ich versucht auf eine andere Art zu prüfen ob der Dienst aktiv is oder nicht.

Hat noch jemand ne andere Idee.

Flare 28. Sep 2006 22:03

Re: SystemParametersInfo Problem
 
Ist der Status wirklich erst wieder hergestellt (also der Screensaver an und Energy Management auch) wenn du dein Programm neu startest?
Dann müsste es ja an deinem Programm hängen.

Und mal ein bissl OT:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  SystemParametersInfo(SPI_SETPOWEROFFACTIVE,1,nil,0);
  SystemParametersInfo(SPI_SETPOWEROFFACTIVE, 1, nil,0);
  Label2.Font.Color := $002DB000;
  Label2.Caption := 'Enabled';
end;
Warum rufst du 2 mal (und zwar immer) die selbe Funktion mit den selben Parametern auf? Da müsste meines erachtens 2 mal das Selbe rauskommen oder verhält sich diese Funktion trotzdem gleicher Parameter 2 mal unterschiedlich?


Flare

sexmagic 28. Sep 2006 22:14

Re: SystemParametersInfo Problem
 
Och ich hab das wohl vergessen wieder zurückzusetzten, ich habe beim 2 Aufruf die Funktion für das Energymanagement drin. Is wohl beim testen falsch übernommen worden von mir.

Der Screensaver wird nciht erst beim neustarten wieder aktiviert, sobald ich mein Programm schliesse ist der wieder aktiviert. Ich dachte er bleibt so lange ausgeschalten bis ich den selbst manuel wieder aktiviere.

:(

EWeiss 28. Sep 2006 22:19

Re: SystemParametersInfo Problem
 
Zitat:

Zitat von sexmagic
Danke Sunlight, ich habe das getestet, funktioniert leider immernoch nicht richtig.

Wenn ich das Programm beende und neustarte ist der Screensaverdienst wieder Aktiviert obwohl ich nach dem Disablen beendet hab.

Auch hab ich versucht auf eine andere Art zu prüfen ob der Dienst aktiv is oder nicht.

Hat noch jemand ne andere Idee.

Bildschirmschoner deaktivieren:
SystemParametersInfo (SPI_SETSCREENSAVEACTIVE, 0, @NULL, SPIF_UPDATEINIFILE);
Bildschirmschoner aktivieren:
SystemParametersInfo (SPI_SETSCREENSAVEACTIVE, 1, @NULL, SPIF_UPDATEINIFILE);

Energie-Sparmodus deaktivieren
SystemParametersInfo(SPI_SETPOWEROFFACTIVE, 0, @NULL, SPIF_UPDATEINIFILE);
Energie-Sparmodus aktivieren
SystemParametersInfo(SPI_SETPOWEROFFACTIVE, 1, @NULL, SPIF_UPDATEINIFILE);

Das ist dein Zauberwort
SPIF_UPDATEINIFILE

Wenn das wirklich nicht funktioniert kannst du per Registry diesen DWORD-Schlüssel ändern
HKEY_CURRENT_USER\Control Panel\Desktop\ScreenSaveActive den DWord-wert auf '0' stellen.
Dann ist er garantiert aus.

EDIT:
Habs vergessen:
Sorge dafür das du den Pfad zur Screensaver SCRNSAVE.EXE auf "" setzt oder löschst.
Erst dann wird im Dialog der eintrag = (KEIN) gesetzt.
alles beim gleichen Schlüssel zu finden.

gruß

sexmagic 29. Sep 2006 16:12

Re: SystemParametersInfo Problem
 
Super vielen vielen Dank, ich habs über den Regschllüssel direkt gemacht.

Ist echt ne tolle Community, sehr nette Leute hier!

DANKE euch.

;)

OldGrumpy 30. Sep 2006 11:27

Re: SystemParametersInfo Problem
 
Neben SPIF_UPDATEINIFILE sollte auch noch SPIF_SENDCHANGE gesetzt werden, damit die Änderungen systemweit bekanntgemacht werden. In vielen Fällen werden die Settings nämlich einmal beim Systemstart gelesen und dann erst wieder auf so eine Benachrichtigung hin.

EWeiss 30. Sep 2006 11:29

Re: SystemParametersInfo Problem
 
Zitat:

Zitat von sexmagic
Super vielen vielen Dank, ich habs über den Regschllüssel direkt gemacht.

Ist echt ne tolle Community, sehr nette Leute hier!

DANKE euch.

;)

Jo kein Problem
Würd mich nur freuen mir würde auch mal jemand helfen :cry:

Gruß

sexmagic 30. Sep 2006 13:09

Re: SystemParametersInfo Problem
 
Hallo Jungs,

leider funktioniert diese Methode nicht wirklich oder ich habe Sie falsch angewendet.

Das jetzige Probelm ist das ..
Delphi-Quellcode:
SystemParametersInfo(SPI_SETPOWEROFFACTIVE, 1, @NULL, SPIF_UPDATEINIFILE);
.. nicht den Standbymodus des Monitors beinflusst.
Wozu dient das PowerOffActive dann?

Naja jedenfalls habe ich keine Möglichkeit gefunden um das über eine API Funktion zu lösen.

Ich hab nun versucht das über einen Timer und der Registry zu deaktivieren, leider finde ich den entsprechenden Wert nicht.

Also beim Programmstart soll der Zeitwert des Monitorstandy Modus ausgelesen werten, wenn die Checkbox zum deaktivieren "checked" ist soll über eine Procedure die die Maus um ein Pixel verschiebt alle "n" ausgeführt werden.

n := ausgelesener Monitor Standby Zeitwert aus der Registry.

Leider finde ich den Registrywert indem die Zeiteinstellung gemacht wurde für den Standbymodus nicht.

Hat jemand ne Ahnung wo der Wert des aktuell gewählten Profils zufinden ist.
Noch wichtiger wäre es ob die immer am selben Ort sind oder ob das beim PC und Laptop durch Energysparmodus wo anderes gespeichert wird.

Würde mich über einen Tip sehr freuen.

Danke

EWeiss 30. Sep 2006 13:38

Re: SystemParametersInfo Problem
 
Zitat:

Zitat von OldGrumpy
Neben SPIF_UPDATEINIFILE sollte auch noch SPIF_SENDCHANGE gesetzt werden, damit die Änderungen systemweit bekanntgemacht werden. In vielen Fällen werden die Settings nämlich einmal beim Systemstart gelesen und dann erst wieder auf so eine Benachrichtigung hin.

Versuch doch mal was OldGrumpy geschrieben hat.

Delphi-Quellcode:
SystemParametersInfo(SPI_SETPOWEROFFACTIVE, 1, @NULL, SPIF_UPDATEINIFILE or SPIF_SENDCHANGE
);

PowerOffActive : gleiche Registry Pfad wie bei SCRSaver.exe
PowerOffTimeOut: ebenfalls der gleiche

Diese verändern sich auch nicht.

gruß

sexmagic 30. Sep 2006 14:03

Re: SystemParametersInfo Problem
 
So grad getestet, geht immernoch aus.

Ich glaub das die PowerOffActive Funktion nichts mit dem Standby des Monitors zu tun hat.

Glaubst du das ein verschieben der Maus um 1 Pixel jede Minute zu Resourcenfressend ist?

Weil ich denke das auslesen des aktuell eingestellten Werts is ziemlich aufwendig da es ja verschiedene Profile gibt und dann auch noch der Unterschied zwischen Lappi und Desktop PC da ist.

EWeiss 30. Sep 2006 14:08

Re: SystemParametersInfo Problem
 
Zitat:

Zitat von sexmagic
So grad getestet, geht immernoch aus.

Ich glaub das die PowerOffActive Funktion nichts mit dem Standby des Monitors zu tun hat.

Glaubst du das ein verschieben der Maus um 1 Pixel jede Minute zu Resourcenfressend ist?

Weil ich denke das auslesen des aktuell eingestellten Werts is ziemlich aufwendig da es ja verschiedene Profile gibt und dann auch noch der Unterschied zwischen Lappi und Desktop PC da ist.

Hmm dann würde ich es anders machen..
Warum den Cursor verschieben ?

Hole dir über GetCursorPos die aktuelle position.
Und setze diese mit SetCursorPos auf die gleichen Coordinaten da muß man nichts verschieben.
So wird der Standbymodus nie aufgerufen.

Gruß

sexmagic 30. Sep 2006 15:11

Re: SystemParametersInfo Problem
 
Jo sowas in der Art hatte ich vor ich hab die procedure dafür auch schon geschrieben, nur wollte ich das halt immer kurz vorm Abschalten des Monitors ausführen um resourcensparend zu arbeiten und auch wirklich nur ausführen wenn benötigt.

Aber wenn ich das jede Minute ausführen lasse sollte es keine Probelm geben denk ich.
Ich werd das mal so übernehmen.

Danke EWeis für deine tatkräftige Unterstützung.

;)

EWeiss 30. Sep 2006 15:40

Re: SystemParametersInfo Problem
 
Zitat:

Zitat von sexmagic
Jo sowas in der Art hatte ich vor ich hab die procedure dafür auch schon geschrieben, nur wollte ich das halt immer kurz vorm Abschalten des Monitors ausführen um resourcensparend zu arbeiten und auch wirklich nur ausführen wenn benötigt.

Aber wenn ich das jede Minute ausführen lasse sollte es keine Probelm geben denk ich.
Ich werd das mal so übernehmen.

Danke EWeis für deine tatkräftige Unterstützung.

;)

Denke auch das wird kein problem darstellen.
CPU gleich null ;)
Sieht nur nicht so schön aus wenn deine Maus da am wandern ist.

gruß

sexmagic 30. Sep 2006 18:20

Re: SystemParametersInfo Problem
 
Jup da hast du recht, leider schaltet der Screen trotzdem in den Standby wenn ich das so mache:
Delphi-Quellcode:
getcursorpos(mpos);
setcursorpos(mpos.x,mpos.y)
Ich hab beim Timer mal ne if .. ShowMessage() eingebaut um zu sehen ob das überhaupt ausgeführt wird, bekomme alle x Sekunden eine Message ausgegeben, daran kanns also nicht liegen.
Anscheinden is das dem Screen zu wenig, das Problem das sich mir daraus wieder stellt ist das wenn ich ein Video ansehe und die maus oben wandert ist das ziemlich nervig.

:)

Haste vielleicht noch ne Idee?


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