![]() |
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:
So schalte ich also während der Laufzeit ein und aus.
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; 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 ;) |
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: |
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. |
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:
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?
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; Flare |
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. :( |
Re: SystemParametersInfo Problem
Zitat:
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ß |
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. ;) |
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.
|
Re: SystemParametersInfo Problem
Zitat:
Würd mich nur freuen mir würde auch mal jemand helfen :cry: Gruß |
Re: SystemParametersInfo Problem
Hallo Jungs,
leider funktioniert diese Methode nicht wirklich oder ich habe Sie falsch angewendet. Das jetzige Probelm ist das ..
Delphi-Quellcode:
.. nicht den Standbymodus des Monitors beinflusst.
SystemParametersInfo(SPI_SETPOWEROFFACTIVE, 1, @NULL, SPIF_UPDATEINIFILE);
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 |
Re: SystemParametersInfo Problem
Zitat:
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ß |
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. |
Re: SystemParametersInfo Problem
Zitat:
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ß |
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. ;) |
Re: SystemParametersInfo Problem
Zitat:
CPU gleich null ;) Sieht nur nicht so schön aus wenn deine Maus da am wandern ist. gruß |
Re: SystemParametersInfo Problem
Jup da hast du recht, leider schaltet der Screen trotzdem in den Standby wenn ich das so mache:
Delphi-Quellcode:
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.
getcursorpos(mpos);
setcursorpos(mpos.x,mpos.y) 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 07:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz