Standby verhindern?

  • Hallo zusammen,
    ich möchte gerne wissen, ob es eine Möglichkeit gibt den Stanby / Ruhezustand zu verhindern.

    Ich habe bereits versucht den Ruhezustzand über die Befehlszeile mit powercfg -hibernate off auszuschalten. Aber aus irgendeinem Grund klappt das nicht einmal manuell.

    Hat jemand eine Idee?

    P.S: Ich habe die Forumssuche benutzt, aber leider nichts passendes gefunden. ;)

    Gruß Flo

    Einmal editiert, zuletzt von bayersoftware (28. Oktober 2010 um 17:54)

  • Spoiler anzeigen
    [autoit]

    ;by rasim
    Global Const $WM_POWERBROADCAST = 0x0218
    Global Const $PBT_APMQUERYSUSPEND = 0x0000
    Global Const $BROADCAST_QUERY_DENY = 0x424D5144

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

    HotKeySet("{Pause}", "_Exit")

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

    $hGUI = GUICreate("Test GUI")

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

    $TestButton = GUICtrlCreateButton("Test", 60, 37, 75, 23)

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

    GUIRegisterMsg($WM_POWERBROADCAST, "WM_POWERBROADCAST")

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

    While 1
    Sleep(100)
    WEnd

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

    Func WM_POWERBROADCAST($hWnd, $Msg, $wParam, $lParam)
    Switch $wParam
    Case $PBT_APMQUERYSUSPEND
    Return $BROADCAST_QUERY_DENY
    EndSwitch
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]
  • Erstmal herzlichen Dank für deine schnelle Antwort.

    Könntest du mir allerdings noch etwas Erklärung dazu liefern? Ich habe zwar versucht mich selbst darüber schlau zu machen (MSDN-Artikel über WM_POWERBROADCAST) doch leider werde ich nicht so ganz schlau daraus. ?(

    Welche Parameter muss ich der Funktion WM_POWERBROADCAST übergeben, und was macht die Funktion genau?

    Danke im Voraus!

    Gruß Florian :rock:

  • Der Funktion WM_POWERBROADCAST() musst du keine Parameter übergeben, das macht GuiRegisterMsg().

    GUIRegisterMsg() registrierte eine Funktion die beim auftreten eines Windows Nachrichtencodes ausgeführt wird. In diesem Fall 0x0218. GUIRegisterMsg() ruft dann die Funktion auf und übergibt die 4 Parameter. Die Funktion entscheidet dann nurnoch, welche Aktion bei einem bestimmten Nachrichtenparameter (in diesem Fall 0x0000) augeführt werden soll. Welche Werte wParam annehmen kann ist im MSDN aufgelistet und erklärt. BROADCAST_QUERY_DENY bricht den Vorgang dann einfach ab.

  • Hi,

    Danke, das habe ich nun soweit verstanden. Nur leider klappt das ganze bei mir nicht. Könnte das evtl. daran liegen, dass ich Windows 7 verwende? :whistling:

    Ich habe jedenfalls den von dir geposteten Code einfach mal in eine leere .au3 gepackt und ausgeführt. Leider wird der Standby dadurch nicht verhindert. Anschließend habe ich die Funktion WM_POWERBROADCAST um eine MsgBox erweitert, um zu erfahren ob er überhaupt in die Funktion kommt, und wenn ja mit welchem Parameter.

    [autoit]


    Global Const $WM_POWERBROADCAST= 0x0218
    Global Const $PBT_APMQUERYSUSPEND = 0x0000
    Global Const $PBT_APMQUERYSTANDBY = 0x0001
    Global Const $BROADCAST_QUERY_DENY = 0x424D5144

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

    ;...

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

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

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

    MsgBox(0, "Test", "wParam = " & $wParam)

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

    Switch $wParam
    Case $PBT_APMQUERYSUSPEND
    Return $BROADCAST_QUERY_DENY

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

    Case $PBT_APMQUERYSTANDBY
    Return $BROADCAST_QUERY_DENY

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

    EndSwitch
    EndFunc

    [/autoit]

    Kurz bevor er sich in den Stanby verabschiedet, gibt er mir also noch den wert von $wParam aus. Dieser ist 0x00000004.
    Mein Versuch darauf zu reagieren, klappte allerdings auch nicht:

    [autoit]


    Global Const $WM_POWERBROADCAST= 0x0218
    Global Const $PBT_APMQUERYSUSPEND = 0x0000
    Global Const $PBT_APMQUERYSTANDBY = 0x0001
    Global Const $PBT_POWERSTATECHANGE = 0x00000004
    Global Const $BROADCAST_QUERY_DENY = 0x424D5144

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

    ;...

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

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

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

    MsgBox(0, "Test", "wParam = " & $wParam)

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

    Switch $wParam
    Case $PBT_APMQUERYSUSPEND
    Return $BROADCAST_QUERY_DENY

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

    Case $PBT_APMQUERYSTANDBY
    Return $BROADCAST_QUERY_DENY

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

    Case $PBT_POWERSTATECHANGE
    Return $BROADCAST_QUERY_DENY

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

    EndSwitch
    EndFunc

    [/autoit]

    Ich hoffe das war verständlich,

    Gruß

  • ... probiere das mal:

    [autoit]

    ; http://msdn.microsoft.com/en-us/library/…v=VS.85%29.aspx
    Global Const $ES_CONTINUOUS = 0x80000000
    Global Const $ES_DISPLAY_REQUIRED = 0x00000002
    Global Const $ES_SYSTEM_REQUIRED = 0x00000001

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

    OnAutoItExitRegister("_Exit")

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

    $aResult = DllCall("Kernel32.dll", "UInt", "SetThreadExecutionState", "UInt", BitOR($ES_CONTINUOUS, $ES_DISPLAY_REQUIRED, $ES_SYSTEM_REQUIRED))
    If @error Or $aResult[0] = 0 Then
    MsgBox(0, "Fehler!", "DLLCall SetThreadExecutionState war erfolglos!")
    Exit
    EndIf

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

    While True
    Sleep(1000)
    WEnd

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

    Func _Exit()
    DllCall("Kernel32.dll", "UInt", "SetThreadExecutionState", "UInt", $ES_CONTINUOUS)
    Exit
    EndFunc

    [/autoit]
  • Super, das scheint zu klappen. (Der Code der von i2c gepostet wure funktioniert nicht mehr, da ab Windows Vista wohl kein Power-Broadcast mehr gesendet wird [hätte auch anfangs erwähnen können dass ich Windows 7 verwende :rolleyes:] )

    Verstehe ich auch soweit, nur zwei Probleme:

    [autoit]

    OnAutoItExitRegister("_Exit")

    [/autoit]

    Meckert er mir an: Unknown function name. (Warum auch immer...)
    lasse ich die Zeile weg, läuft es soweit.

    Dann verstehe ich noch nicht ganz wozu man das BitOR braucht. Ich weiß zwar was die Funktion macht, aber nicht wozu sie hier gut ist.

    Vielen Dank nochmal.

  • Guten Morgen,

    zu Problem 1: Hast Du vielleicht noch ein AutoIt in einer Version < 3.3.4?

    zu Problem 2: Das BitOr() ist die gebräuchlichste Methode, um Bitwerte zu verknüpfen. Wenn man sich (wie in diesem Fall) sicher ist, dass sich die in den Operanden gesetzten Bits nicht überschneiden, reicht auch eine Addition.