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

Ustawienie usypiania windowsa z poziomu programu

Nowy postNapisane: czwartek, 24 marca 2011, 12:00
przez Corvis
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

Re: Ustawienie usypiania windowsa z poziomu programu

Nowy postNapisane: wtorek, 29 marca 2011, 11:18
przez Corvis
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.

Re: Ustawienie usypiania windowsa z poziomu programu

Nowy postNapisane: wtorek, 29 marca 2011, 16:02
przez Cyfrowy Baron
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.

Re: Ustawienie usypiania windowsa z poziomu programu

Nowy postNapisane: środa, 30 marca 2011, 07:25
przez Corvis
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.