Wie rufe ich StandBy/Hibernate mit AutoIt auf?

  • Hi,
    ich hab auch mal ne Frage..
    Als Diagnose-Programm für einen Rechner, auf dem der StandBy-Modus nicht(mehr??)
    funktioniert, habe ich ganz einfach die Aufrufmöglichkeiten von ShutDown() in
    ein GUI gepackt:

    Spoiler anzeigen
    [autoit]

    ;<AutoItScript>
    #NoTrayIcon
    #include <GUIConstants.au3>
    #include <Constants.au3>
    ;+----------------------------------------------------------------------------+
    ;| Header: Bestimmen der Übergabeparameter |
    ;| ( Alles Strings(!!!), bis auf ArgC ) |
    ;| FontAnzeigeCheck: |Il1 sind Alt-0124, Großes i, Kleines L, Eins |
    Const $Author="Runterfahren.au3 ©2007 by ytwinky, MD"; |
    ;| EMail: [email='PIII1kSystem-AutoIt3Forum@yahoo.de'][/email] |
    ;| AutoIt3-Version: aktuelle(beta) |
    ;| Editor: SciTE aktuelle Version, feste Schriftart |
    ;| Zweck : Runterfahren in vielen Variationen, geht jetzt(dank trallala) |
    ;| Tab auf 2 setzen wg. Lesbarkeit |
    ;+----------------------------------------------------------------------------+
    Const $NextUser="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\"
    ;Vorsicht:Schreibt eine Ini-Datei ins Skript-Verzeichnis, wenn's erlaubt ist..DefaultUserName
    #Region ### START Koda GUI section ### Form=d:\sprachen\autoit3\au3\kxf\shutdown.kxf
    Const $PowerDown=8, $cStandBy=32, $cHibernate=64
    Const $DefMsg="gibs nich", $IniFile=@ScriptDir &"\Runterfahren.Ini"
    Dim $AppName
    $ShutDown = GUICreate("ShutDown", 190, 343, 289, 187)
    $Main = GUICtrlCreateGroup("", 0, 0, 189, 341)
    $Titel = GUICtrlCreateLabel("Runterfahren", 4, 12, 179, 30, $SS_CENTER)
    GUICtrlSetFont(-1, 22, 400, 0, "Arial")
    GUICtrlSetColor(-1, 0x000080)
    GUICtrlSetTip(-1, "©2007 by ytwinky, MD")
    $Flags = GUICtrlCreateGroup("Flags", 8, 52, 173, 61)
    $AppName=IniRead($IniFile, "MitGewalt", "Frage", $DefMsg)
    $cbMitGewalt = GUICtrlCreateCheckbox("Mit Gewalt", 12, 68, 73, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    If $AppName<>$DefMsg Then GUICtrlSetState(-1, $AppName)
    GUICtrlSetTip(-1, "Wenn möglich..")
    $cbAusDieMaus = GUICtrlCreateCheckbox("Ausschalten", 100, 68, 77, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetTip(-1, "Rechner(je nach Funktion) ausschalten" &@Lf &"Änderung nur im Quelltext möglich..")
    $cbFragen = GUICtrlCreateCheckbox("Immer Fragen", 12, 92, 97, 17)
    $AppName=IniRead($IniFile, "ImmerFragen", "Frage", $DefMsg)
    If $AppName<>$DefMsg Then GUICtrlSetState($cbFragen, $AppName)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Optionen = GUICtrlCreateGroup("Optionen", 8, 120, 173, 181)
    GUICtrlSetFont(-1, 9, 800, 0, "Arial")
    $rbAbmelden = GUICtrlCreateRadio("Abmelden", 12, 148, 77, 17)
    GUICtrlSetFont(-1, 9, 800, 0, "Arial")
    $coNext = GUICtrlCreateCombo("Default", 88, 147, 90, 25)
    GUICtrlSetData(-1, "Margot|Erich|Ich|Administrator|Benutzer|Gast")
    GUICtrlSetTip(-1, "Nur für Admins..")
    $lbNext = GUICtrlCreateLabel("Nächster Benutzer:", 86, 132, 93, 15)
    GUICtrlSetTip(-1, "Nur bei Admins..")
    $rbNeustart = GUICtrlCreateRadio("Neustart", 12, 168, 69, 17)
    GUICtrlSetFont(-1, 9, 800, 0, "Arial")
    $rbRuhezustand = GUICtrlCreateRadio("Ruhezustand", 12, 188, 113, 17)
    GUICtrlSetFont(-1, 9, 800, 0, "Arial")
    $rbRunterfahren = GUICtrlCreateRadio("Runterfahren", 12, 208, 113, 17)
    GUICtrlSetFont(-1, 9, 800, 0, "Arial")
    $rbStandBy = GUICtrlCreateRadio("StandBy", 12, 228, 113, 17)
    GUICtrlSetFont(-1, 9, 800, 0, "Arial")
    $lbAndererTitel = GUICtrlCreateLabel("Anderes Programm", 12, 250, 107, 17)
    $AppName=IniRead($IniFile, "AppName", "Prog", $DefMsg)
    $efAnderes = GUICtrlCreateInput("eingeben oder suchen..", 27, 266, 122, 21)
    If $AppName<>$DefMsg Then GUICtrlSetData($efAnderes, $AppName)
    $rbAnderes = GUICtrlCreateRadio("", 12, 268, 13, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    If $AppName<>$DefMsg Then GUICtrlSetState(-1, $GUI_ENABLE)
    $btSuchen = GUICtrlCreateButton("..", 152, 267, 23, 21, 0)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $btQuit = GUICtrlCreateButton("Quit", 104, 308, 75, 25, 0)
    GUICtrlSetFont(-1, 11, 800, 0, "Arial")
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    ColorizeIt()
    #EndRegion ### END Koda GUI section ###
    While 1
    $Which=GUIGetMsg()
    If GUICtrlRead($cbMitGewalt)=$GUI_CHECKED Then
    $Erzwingen=$SD_FORCE
    Else
    $Erzwingen=0
    EndIf
    Switch $Which
    Case $btQuit, $GUI_EVENT_CLOSE
    Exit
    Case $btSuchen
    $AppName= FileOpenDialog("Andere Anwendung auswählen", "C:\", "Nur Exe-Dateien (*.Exe)|Alle Dateien (*.*)", 3, "existierende Datei suchen..")
    If $AppName<>"" Then
    GUICtrlSetData($efAnderes, $AppName)
    IniWrite($IniFile, "AppName", "Prog", $AppName)
    EndIf
    Case $cbFragen
    IniWrite($IniFile, "ImmerFragen", "Frage", GUICtrlRead($cbFragen))
    Case $cbMitGewalt
    IniWrite($IniFile, "MitGewalt", "Frage", GUICtrlRead($cbMitGewalt))
    ColorizeIt()
    Case $coNext
    If GUICtrlRead($coNext)<>"Default" And GUICtrlRead($coNext)<>RegRead($NextUser, "DefaultUserName")Then
    If IsAdmin() Then
    RegWrite($NextUser, "DefaultUserName", "REG_SZ", GUICtrlRead($coNext))
    RegWrite($NextUser, "DefaultPassword", "REG_SZ", RegRead($NextUser &"Immer\", GUICtrlRead($coNext)));ggfs. löschen
    Else
    MsgBox(0, "No, no, never..", "..das dürfen nur Admins..")
    EndIf
    EndIf
    Case $rbAbmelden
    DoIt($SD_LOGOFF+$Erzwingen, "abmelden")
    Case $rbNeuStart
    DoIt($SD_REBOOT+$Erzwingen, "neustarten")
    Case $rbRuheZustand
    DoIt($cHibernate, "Ruhezustand")
    Case $rbRunterfahren
    DoIt($SD_SHUTDOWN+$Erzwingen, "runterfahren")
    Case $rbStandBy
    DoIt($cStandBy, "StandBy")
    EndSwitch
    Wend

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

    Func _Fragen($Msg)
    Return MsgBox(4100, "NagNagNag", "Wirklich " &$Msg &"?")=$IDYes
    EndFunc

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

    Func DoIt($What, $Msg)
    Dim $Really=GUICtrlRead($cbFragen)=$GUI_UNCHECKED
    If Not $Really Then $Really=_Fragen($Msg)
    If $Really Then
    If ShutDown($What)=0 Then MsgBox(0, "Ooops", "So geht das nicht..")
    EndIf
    Exit
    EndFunc

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

    Func ColorizeIt()
    If GUICtrlRead($cbMitGewalt)=$GUI_CHECKED Then
    GUICtrlSetColor($cbMitGewalt, 0x800080)
    GUICtrlSetColor($rbAbmelden, 0x800080)
    GUICtrlSetColor($rbRunterfahren, 0x800080)
    GUICtrlSetColor($rbNeustart, 0x800080)
    Else
    GUICtrlSetColor($cbMitGewalt, 0x000000)
    GUICtrlSetColor($rbAbmelden, 0x000000)
    GUICtrlSetColor($rbRunterfahren, 0x000000)
    GUICtrlSetColor($rbNeustart, 0x000000)
    EndIf
    EndFunc

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

    ;</AutoItScript>

    [/autoit]

    Abmelden, Runterfahren und Neustarten geht problemlos, aber Ruhezustand und StandBy funktionieren nicht.
    Bevor jetzt Hinweise auf dieSystemeinstellunge etc. pp. kommen: Mit ShutDownPro funktionieren die Aufrufe.
    Also bei meinem Rechner ist alles Okay.
    Habe ich was falsch gemacht oder vergessen?
    Ich freue mich auf eure Antworten und danke im Voraus
    peethebee :
    Danke, den AutoIt-schalter kannte ich noch nicht :oops:
    [Edit]
    ..kleine Schönheitsoperation ;)
    [Edit]
    Das Skript ist berichtigt und funktioniert, Dank an trallala ;)
    [Nochn Edit]
    ..neue Version..
    (aber fehlerhaft, wg. C&P, ist jetzt berichtigt..)
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

    9 Mal editiert, zuletzt von ytwinky (19. Februar 2007 um 13:06)

  • Hallo,

    kleiner Tipp!

    Ruhezustand
    -----------------
    powercfg /hibernate on
    rundll32.exe powrprof.dll,SetSuspendState

    Standby
    -----------
    powercfg /hibernate off
    rundll32.exe powrprof.dll,SetSuspendState

    ... den Rest packst du schon ;)

    MfG
    Trallala

  • Danke trallala, deine Lösung werde ich wohl einbauen müssen ;)
    aber das beantwortet meine Frage ja nur zum Teil :D
    Denn(s. Titel) eigentlich wollte ich ja etwas anderes wissen..
    Funktionieren die Schalter, die ich :

    [autoit]

    Const $PowerDown=8, $cStandBy=32, $cHibernate=64

    [/autoit]

    genannt habe, nicht?
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

    2 Mal editiert, zuletzt von ytwinky (16. Februar 2007 um 21:47)

  • Hallo,

    2ter teil deiner frage ;)

    die constanten die du definiert hast, sind korrekt und werden auch richtig an die funktion übergeben.

    hast du probiert die aktion manuel auszulösen ?
    shutdown(32) oder shutdown(64)

    Edit:
    Mein fazit - probiere es mal so: ;)

    Spoiler anzeigen
    [autoit]


    Func DoIt($What, $Msg)
    Dim $Really=GUICtrlRead($cbFragen)=$GUI_UNCHECKED
    If Not $Really Then $Really=_Fragen($Msg)
    If $Really Then
    If $Msg="Ruhezustand" Then
    RunWait("powercfg /hibernate on")
    RunWait("rundll32.exe powrprof.dll,SetSuspendState")
    ElseIf $Msg="StandBy" Then
    RunWait("powercfg /hibernate off")
    RunWait("rundll32.exe powrprof.dll,SetSuspendState")
    Else
    If ShutDown($What+$SD_FORCE)=0 Then MsgBox("0", "Ooops", "So geht das nicht..")
    EndIf
    EndIf
    EndFunc

    [/autoit]


    MfG
    trallala

    4 Mal editiert, zuletzt von trallala (16. Februar 2007 um 23:10)

  • Hi trallala,
    das war's :yahoo:
    Vielen Dank für deinen Tipp. Ich hatte es mit dem Einsatz von $SD_Force etwas übertrieben ;)
    Das obige Skript ist berichtigt und läuft..
    ..und mit dem Exit am Ende ist auch der Bildschirm nach dem Standby wieder Ok :D
    Ich wollte es mit Autoit machen und das geht jetzt..
    Die Lösung mit PowerCfg ist auch wieder eine Lösung mit einem anderen Programm..
    ..da hätte ich dann auch ShutDownPro nehmen können :D
    Trotzdem vielen Dank für deine Mühe ^^
    [Edit]
    die neue Version von Runterfahren.au3 habe ich jetzt oben hineinkopiert..
    Was gibt es Neues? Nun das GUI ist imho schöner geworden..
    Aber im Ernst: Die von der Option $SD_FORCE betroffenen Optionen werden
    farblich gekennzeichnet oder nicht..
    Es gibt jetzt eine ComboBox mit einigen User, die als DefaultUser eingestellt
    werden können. Ich habe hier feste Texteinträge genommen, weil ich in meiner
    Registry unter ..WinLogon\ den Key 'Immer' angelegt habe und dort stehen für
    bestimmte Benutzer auch die Kennwörter. Wer das nicht möchte, muß die entsprechende
    Zeile im Skript löschen oder zum Kommentar machen :D
    Das Skript ist bewußt nicht so gemacht, daß es sich selbst mit Adminrechten
    ausstattet, das soll jeder selbst entscheiden. Möglichkeiten dazu sind hier im
    Forum ja schon besprochen worden. Netz-Admins werden vllt. die Möglichkeit vermissen,
    Remote-Rechner runterzufahren, aber sie wären nicht Netz-Admins, wenn sie das nicht
    selbst ergänzen könnten..
    Also viel Spaß mit Runterfahren(.au3) :lol:

    Bis zum nächsten Mal
    Gruß
    ytwinky

    (Ich) benutze stets die aktuelle (Beta) und SciTE..

    Einmal editiert, zuletzt von ytwinky (18. Februar 2007 um 17:06)