Zdarzenie usypiania i hibernacji systemu Windows

Zdarzenie usypiania i hibernacji systemu Windows
WP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 150
0

Witam.
W mojej aplikacji WPF pisanej w C# pod .NET 4.8 próbuję przechwycić moment, gdy system jest usypiany lub hibernowany.
Wykorzystuję do tego Microsoft.Win32.SystemEvents.PowerModeChanged.
Na komputerze stacjonarnym, na którym tworzę tą aplikację wszystko działa prawidłowo. Ale na laptopie z tym samym systemem (Windows 10) aplikacja nie przechwytuje zdarzenia zmiany stany zasilania. Ten sam kod.
Aplikacja jest okienkowa (nie serwis). Próbowałem przypisywać to zdarzenie w konstruktorze, potem w zdarzeniu Loaded() głównego okna i nic to nie zmienia.
Czy ktoś natknął się na taki problem?
Mam wrażenie że ten laptop nie do końca się usypia (tak jakby dalej działały wszystkie zadania). Zdarzenia na zamknięcie pokrywy są ustawione na usypianie, ręczne wywołanie uśpienia z menu start też nic nie zmienia.
Gdzie jest problem?

Poniżej mój kod:

Kopiuj
Microsoft.Win32.SystemEvents.PowerModeChanged += new Microsoft.Win32.PowerModeChangedEventHandler(OnPowerChange);
Kopiuj
private void OnPowerChange(object sender, Microsoft.Win32.PowerModeChangedEventArgs e)
        {
            ExceptionHandler.Instance.LogTrace(string.Format("OnPowerChange to: {0}", e.Mode.ToString()));
            if (e.Mode == Microsoft.Win32.PowerModes.Suspend)
            {
                Logout();
            }
        }
Marius.Maximus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2200
1

W win32 api to byłby WM_POWERBROADCAST https://learn.microsoft.com/en-us/windows/win32/power/wm-powerbroadcast i to mi działało,
zakładam że Microsoft.Win32.SystemEvents.PowerModeChanged to jakiś opakowany odpowiednik w .net

Jezeli nie jesteś pewien czy laptop sie usypia to napisz program/skypt ktory co sekunde zapisze kolejną date+czas do pliku i potwierdzisz/obalisz tezę
bo jak laptop sie nie usypia to i nie bedzie zdarzenia

WP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 150
0
Marius.Maximus napisał(a):

W win32 api to byłby WM_POWERBROADCAST https://learn.microsoft.com/en-us/windows/win32/power/wm-powerbroadcast i to mi działało,
zakładam że Microsoft.Win32.SystemEvents.PowerModeChanged to jakiś opakowany odpowiednik w .net

Jezeli nie jesteś pewien czy laptop sie usypia to napisz program/skypt ktory co sekunde zapisze kolejną date+czas do pliku i potwierdzisz/obalisz tezę
bo jak laptop sie nie usypia to i nie bedzie zdarzenia

Dzięki za odpowiedź.
Niestety WM_POWERBROADCAST na laptopie nie działa (a na kompie stacjonarnym działa).
Sprawdziłem również to usypianie. I rzeczywiście system jest usypiany (dodałem logowanie aktualnego czasu co sekundę i podczas uśpienia jest przerwa w logowaniu).
Inne zdarzenia systemowe są przechwytywane. Tylko ten WM_POWERBROADCAST nie zgłasza się nigdy.

Na laptopie jest Windows 22H2, tak samo jak na stacjonarce.
Czy jest jakiś inny sposób na przechwycenie zdarzenia usypiania. A może wiesz jak przechwycić zdarzenie wyłączenia ekranu monitora?

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
3

z forum MSa

Kopiuj
The problem mostly is, that your laptop is now forced into modern standby, which started (the force of modern standby, not modern standby itself) with 2004. If you use modern standby, you need to register and unregister for notifications like this:

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-registersuspendresumenotification

https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-unregistersuspendresumenotification
Marius.Maximus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2200
1

To do kompletu Registering for Power Events

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.