Zdarzenie usypiania i hibernacji systemu Windows

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:

Microsoft.Win32.SystemEvents.PowerModeChanged += new Microsoft.Win32.PowerModeChangedEventHandler(OnPowerChange);
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();
            }
        }
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

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?

3

z forum MSa

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
1

To do kompletu Registering for Power Events

1 użytkowników online, w tym zalogowanych: 0, gości: 1