CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Ustawienie usypiania windowsa z poziomu programu

Ustawienie usypiania windowsa z poziomu programu

dział ogólny

Ustawienie usypiania windowsa z poziomu programu

Nowy postprzez Corvis » czwartek, 24 marca 2011, 12:00

Witam,


Wie ktoś jak można z poziomu programu zrobić następujące rzeczy: (W przypadku laptopów)

1. Wyłączyć przejście w tryb uśpienia
2. Wyłączyć wyłączenie ekranu

Są to opcje zasilania.

Pozdrawiam
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Ustawienie usypiania windowsa z poziomu programu

Nowy postprzez Corvis » wtorek, 29 marca 2011, 11:18

Zrobiłem to inaczej, złapałem komunikaty kiedy windows przechodzi w stan uśpienia, wraca do życia i obsłużyłem je.

KOD cpp:     UKRYJ  
void __fastcall TForm1::GetActiveApp(TMessage &Msg)
{
    if(Msg.Msg == WM_POWERBROADCAST) {
        if(Msg.WParam == PBT_APMSUSPEND) {
            Memo1->Lines->Add("Śpi");
        } else if(Msg.WParam == PBT_APMRESUMESUSPEND) {
            Memo1->Lines->Add("Wstaje");
        }
    }

    ActiveApp(Msg);
}
 



Nie chciało mi się już pisać wszystkich deklaracji i całego kodu. Funkcje GetActiveApp(TMessage &Msg) nie raz pokazywał jak zrobić baron.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Ustawienie usypiania windowsa z poziomu programu

Nowy postprzez Cyfrowy Baron » wtorek, 29 marca 2011, 16:02

Ten kod jednak tylko przechwytuje informacje o przejściu w stan uśpienia, a Tobie chodziło chyba o zmianę ustawień schematu zasilania?!

Corvis napisał(a):Wie ktoś jak można z poziomu programu zrobić następujące rzeczy: (W przypadku laptopów)

1. Wyłączyć przejście w tryb uśpienia
2. Wyłączyć wyłączenie ekranu


Poszukiwałem jakichś informacji i udało mi się ustalić, że należy pozmieniać wpisy rejestru, chyba w tym kluczu: HKEY_CURRENT_USER\Control Panel\PowerCfg\GlobalPowerPolicy. W trakcie poszukiwań natknąłem się na funkcję PowerCreateSetting:

KOD cpp:     UKRYJ  
 DWORD WINAPI PowerCreateSetting(
   HKEY RootSystemPowerKey,
   const GUID* SubGroupOfPowerSettingsGuid,
   const GUID* PowerSettingGuid    );


Niestety, o ile pierwszy parametr to NULL, drugi to jedna z możliwości:

KOD text:     UKRYJ  
NO_SUBGROUP_GUID
fea3413e-7e05-4911-9a71-700331f1c294 Settings in this subgroup will be part of the default power scheme.

GUID_DISK_SUBGROUP
0012ee47-9041-4b5d-9b77-535fba8b1442 Settings in this subgroup control power management configuration of the system's hard disk drives.
 
GUID_SYSTEM_BUTTON_SUBGROUP
4f971e89-eebd-4455-a8de-9e59040e7347 Settings in this subgroup control configuration of the system power buttons.

GUID_PROCESSOR_SETTINGS_SUBGROUP
54533251-82be-4824-96c1-47b60b740d00 Settings in this subgroup control configuration of processor power management features.

GUID_VIDEO_SUBGROUP
7516b95f-f776-4464-8c53-06167f40cc99 Settings in this subgroup control configuration of the video power management features.

GUID_BATTERY_SUBGROUP
e73a048d-bf27-4f12-9731-8b2076e8891f Settings in this subgroup control battery alarm trip points and actions.

GUID_SLEEP_SUBGROUP
238C9FA8-0AAD-41ED-83F4-97BE242C8F20 Settings in this subgroup control system sleep settings.

GUID_PCIEXPRESS_SETTINGS_SUBGROUP
501a4d13-42af-4429-9fd1-a8218c268e20 Settings in this subgroup control PCI Express settings.


Trzecia argument jest nieznany, wiadomo tylko, że reprezentuje pojedyncze ustawienia tworzonego schematu zasilania.
Użycie tej funkcji wymaga włączenia do projektu biblioteki PowrProf.h.. Z opisu zaś wynika, że jest ona zgodna dopiero z systemem Vista.



Inną funkcją, która działa prawdopodobnie zarówno w systemie WinXP jak i nowszych jest SetActivePwrScheme:

KOD cpp:     UKRYJ  
BOOLEAN SetActivePwrScheme(
  UINT uiID,
  PGLOBAL_POWER_POLICY lpGlobalPowerPolicy,
  PPOWER_POLICY lpPowerPolicy    );


Kombinowałem coś takiego:

KOD cpp:     UKRYJ  
 GLOBAL_POWER_POLICY GlobalPowerPolicy;
 UINT  uiID;
 POWER_POLICY pwrScheme;

 if( !GetCurrentPowerPolicies(&GlobalPowerPolicy, &pwrScheme) )
 {
  ShowMessage("Błąd");
  return;
 }

 GlobalPowerPolicy.user.PowerButtonAc.Action = PowerActionShutdown;

 WriteGlobalPwrPolicy(&GlobalPowerPolicy);

 GetActivePwrScheme(&uiID);
 ReadPwrScheme(uiID, &pwrScheme);
 SetActivePwrScheme(uiID, &GlobalPowerPolicy, &pwrScheme);


ale niczego to nie zmienia. Pomoc środowiska Embarcadero jest w tej kwestii bardzo uboga, w zasadzie niczego nie wyjaśnia.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Ustawienie usypiania windowsa z poziomu programu

Nowy postprzez Corvis » środa, 30 marca 2011, 07:25

Dzięki baronie za pomoc :-)

Miałem problem, że urządzenie pracujące na wirtualnym porcie COM zawieszało aplikację jak laptop się wygaszał. 1 myśl to zmienić ustawienia zasilania, tak żeby nie przechodził w tryb uśpienia. Jednak pozbyłem się problemu kodem który podałem. Złapałem momenty przejścia w stan uśpienia oraz przywrócenia i odpowiednio je obsłużyłem. Problem zniknął :-) Chyba nawet te moje 2 rozwiązanie jest rozsądniejsze, bo nie koniecznie ktoś sobie może życzyć, żeby program bez jego wiedzy zmieniał ustawienia zasilania.

W każdym razie, jeszcze raz dzięki.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron