WM_POWERBROADCAST - Verständnisfrage

  • Hey,

    ich untersuche gerade die WM_POWERBROADCAST Nachrichten. Konkret möchte ich unterscheiden ob das Aufwecken durch einen Benutzer oder durch einen automatischen Task bewirkt wurde.

    Hier mein Testskript:

    Spoiler anzeigen
    [autoit]


    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    ;#include <myscripts_constants.au3>
    #include <file.au3>
    #include <date.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global Const $PBT_APMRESUMESUSPEND = 0x00000007 ;7 (0x7)
    Global Const $PBT_APMPOWERSTATUSCHANGE=0x0000000A ;10 (0xA)
    Global Const $PBT_APMRESUMEAUTOMATIC=0x00000012 ;18 (0x12)
    Global Const $PBT_APMSUSPEND=0x00000004 ;4 (0x4)
    Global Const $PBT_POWERSETTINGCHANGE=0x00008013 ;32787 (0x8013)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $title = "WM_POWERBROADCAST_Debug"
    Global $hGUI = GUICreate($title, 500, 500)
    Global $hedit = GUICtrlCreateEdit("", 0, 0, 500, 420)
    GUICtrlSetData(-1, "Startup")
    Global $hsave = GUICtrlCreateButton("Save", 20, 450, 50, 30)
    Global $htest = GUICtrlCreateButton("Test", 120, 450, 50, 30)
    Global $log = @DesktopDir & "\" & $title & ".txt"
    Global $counter = 1

    [/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_POWERBROADCAST, "_MY_WM_POWERBROADCAST")
    GUISetState(@SW_SHOW, $hGUI)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $GUIMsg = GUIGetMsg()
    Switch $GUIMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    Case $hsave
    _FileWriteLog($log, GUICtrlRead($hedit), 1)
    MsgBox(0, "Speicher", "Log gespeichert")
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func _MY_WM_POWERBROADCAST($hWnd, $Msg, $wParam, $lParam)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & $counter & " - hwnd=" & $hWnd)
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & $counter & " - msg=" & $Msg)
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & $counter & " - lParam" & $lParam)

    [/autoit] [autoit][/autoit] [autoit]

    Switch $wParam
    Case $PBT_APMRESUMESUSPEND
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & _NowCalc()& " - " & $counter & " - wParam=PBT_APMRESUMESUSPEND=" & $wParam)
    case $PBT_APMRESUMEAUTOMATIC
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & _NowCalc()& " - " & $counter & " - wParam=PBT_APMRESUMEAUTOMATIC=" & $wParam)
    Case $PBT_APMPOWERSTATUSCHANGE
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & _NowCalc()& " - " & $counter & " - wParam=PBT_APMPOWERSTATUSCHANGE=" & $wParam)
    case $PBT_APMSUSPEND
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & _NowCalc()& " - " & $counter & " - wParam=PBT_APMSUSPEND=" & $wParam)
    Case Else
    GUICtrlSetData($hedit,GUICtrlRead($hedit) &@crlf & _NowCalc()& " - " & $counter & " - wParam" & $wParam)
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    $counter += 1

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>_MY_WM_POWERBROADCAST

    [/autoit]

    Damit erhalte ich folgende Nachrichten:

    Aufwecken durch eine Benutzeraktion (Tastenanschlag, Doppelclick usw.)


    Dieses Log verstehe ich.
    Zuerst kommt die PBT_APMRESUMEAUTOMATIC Nachricht, die immer abgefeuert wird sobald der PC reaktiviert wird.
    Anschließend kommt die PBT_APMRESUMESUSPEND Nachrichti um zu erkennen, dass der Benutzer die Reaktivierung bewirkt hat.

    Aufwecken durch eine geplante Aufgabe:


    Hier wird trotzdem die PBT_APMRESUMESUSPEND abgesetzt obwohl keine Benutzereingabe erfolgte.
    Die Nachricht kommt 2 Skeunden verspätet an. Ist das aufgrund der ersten Benutzereingabe nach dem Standby?

    Entspricht irgendwie nicht der Beschreibung im msdn: http://msdn.microsoft.com/en-us/library/…v=vs.85%29.aspx
    Oder wie seht ihr das? Ist das bei euch genauso?

    Wie kann ich jetzt zweifelsfrei unterscheiden wie der PC aufgeweckt wurde? ?(

    Gruß nuts

  • Ich würde einfach schauen ob PBT_APMRESUMEAUTOMATIC und PBT_APMRESUMESUSPEND zu selben Zeit erstellt wurden. Wenn ja ist es durch Benutzereingab geweckt worden, wenn nicht dann durch das System.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Ich bin nicht ganz sicher wie sich das umsetzen lässt.
    Aus der _MY_WM_POWERBROADCAST Funktion muss ich schnellst möglich wieder raus, da das sonst gern crasht.

    Vielleicht einer Variable in _MY_WM_POWERBROADCAST je nach Event einem spezifischen Wert zuweisen und diese in der Hauptschleife abprüfen?

  • Hm so ganz sicher bin ich leider immernoch nicht wie ich das umsetzen soll :(

    Scheint wohl wirklich so zu sein, dass die erste Benutzeraktion immer ein PBT_APMRESUMESUSPEND auslöst.
    Irgendwie ist das blöd gelöst ...