autostart nach standby hibernate

  • Hallo ,

    ich brauche mal schnell Hilfe zum starten eines Programms nach dem Standby oder HibernateModus unter
    Windows Vista .

    Der Hintergrund ist die Steuerung meines HTPC's .

    Ich betreibe einen 8 Zoll Touchscreen und einen TFT TV an meinem HTPC .

    Habe mir schon Autoit Scripte geschrieben , mit denen ich automatisch entweder den Touchscreen oder
    das TFT TV anspreche .

    Jetzt muss ich noch das Aufwachen aus dem Standby und HibernateModus abfangen .

    Es soll zB nach dem Standby immer der Touchscreen aktiviert werden , auch wenn der PC vor dem Standby im TV
    Modus war . Das Script zum wechseln der Auflösungen habe ich schon fertig .

    Zum zweiten soll nach dem Standby/Hibernate geprüft werden , ob TerratecHomeCinema Aufnahmen
    geplant sind .

    Wenn ich den Rechner selber über ein Script in den Standby versetze , kann das Script die Aufgaben
    automatisch ausführen .

    Wie fange ich aber den automatischen StangdbyModus ab .

    Gruß Ede

    Einmal editiert, zuletzt von CrazyEde (14. Februar 2009 um 16:47)

    • Offizieller Beitrag

    Hi,

    vielleicht hilft dies:

    Spoiler anzeigen
    [autoit]

    Dim $strComputer = "localhost", $message_title, $message_content
    $oBJ = ObjGet ("winmgmts:\\" & $strComputer & "\root\cimv2")
    $event = $oBJ.ExecNotificationQuery("Select * from Win32_PowerManagementEvent")
    $ret = $event.NextEvent.EventType
    ConsoleWrite($ret & @CRLF)
    Switch $ret
    Case 4
    $message_title = "Entering Suspend"
    $message_content = "Indicates that the computer is about to enter the suspended state."
    Case 7
    $message_title = "Resume from Suspend"
    $message_content = "Indicates that a ResumeSuspend message has been sent, enabling the computer to return to its regular power state."
    Case 10
    $message_title = "Power Status Change"
    $message_content = "Indicates a change in the power status of the computer, such as a switch from battery power to AC, or from AC to an uninterruptible power supply"
    Case 11
    $message_title = "OEM Event"
    $message_content = "Indicates that an Advanced Power Management (APM) BIOS has sent an OEM event"
    Case 18
    $message_title = "Resume Automatic"
    $message_content = "Indicates that the computer has awakened in response to an event"
    EndSwitch

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

    MsgBox (0, $message_title, $message_content)

    [/autoit]

    Mega

  • Das geht auch mit Window-Messages:

    Spoiler anzeigen
    [autoit]

    Global Const $WM_POWERBROADCAST = 0x218
    Global Const $PBT_APMPOWERSTATUSCHANGE = 0xA ; Power status has changed.
    Global Const $PBT_APMRESUMEAUTOMATIC = 0x12 ; Operation is resuming automatically from a low-power state. This message is sent every time the system resumes.
    Global Const $PBT_APMRESUMESUSPEND = 0x7 ;Operation is resuming from a low-power state. This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key.
    Global Const $PBT_APMSUSPEND = 0x4 ; System is suspending operation.
    Global Const $PBT_POWERSETTINGCHANGE = 0x8013 ; A power setting change event has been received.

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

    ; Windows Server 2003, Windows XP, and Windows 2000: The following event identifiers are also supported.
    Global Const $PBT_APMBATTERYLOW = 0x9 ; Battery power is low. In Windows Server 2008 and Windows Vista, use PBT_APMPOWERSTATUSCHANGE instead.
    Global Const $PBT_APMOEMEVENT = 0xB ; OEM-defined event occurred. In Windows Server 2008 and Windows Vista, this event is not available because these operating systems support only ACPI; APM BIOS events are not supported.
    Global Const $PBT_APMQUERYSUSPEND = 0x0 ; Request for permission to suspend. In Windows Server 2008 and Windows Vista, use the SetThreadExecutionState function instead.
    Global Const $PBT_APMQUERYSUSPENDFAILED = 0x2 ; Suspension request denied. In Windows Server 2008 and Windows Vista, use SetThreadExecutionState instead.
    Global Const $PBT_APMRESUMECRITICAL = 0x6 ; Operation resuming after critical suspension. In Windows Server 2008 and Windows Vista, use PBT_APMRESUMEAUTOMATIC instead.
    Global Const $BROADCAST_QUERY_DENY = 0x424D5144

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

    GUICreate("Event Receiver")
    GUIRegisterMsg($WM_POWERBROADCAST,"MY_WM_POWERBROADCAST")
    While 1
    Sleep(100)
    WEnd
    Func MY_WM_POWERBROADCAST($hWnd, $uMsg, $wParam, $lParam)
    ; Beschreibgungen auf http://msdn.microsoft.com/en-us/library/aa373247(VS.85).aspx
    Switch $wParam
    Case $PBT_APMPOWERSTATUSCHANGE
    ConsoleWrite("POWERSTATUSCHANGE" & @CRLF)
    Case $PBT_APMRESUMEAUTOMATIC
    ConsoleWrite("RESUMEAUTOMATIC" & @CRLF)
    Case $PBT_APMRESUMESUSPEND
    ConsoleWrite("RESUMESUSPEND" & @CRLF)
    Case $PBT_APMSUSPEND
    ConsoleWrite("SUSPEND" & @CRLF)
    Case $PBT_POWERSETTINGCHANGE
    Local $POWERBROADCAST_SETTING = DllStructCreate("byte[16] PowerSetting; DWORD DataLength; ushort Data;",$lParam)
    ConsoleWrite("POWERSETTINGCHANGE" & @CRLF)
    Case $PBT_APMBATTERYLOW
    ConsoleWrite("BATTERYLOW" & @CRLF)
    Case $PBT_APMOEMEVENT
    Local $OEM_event = $lParam ; The OEM-defined event code that was signaled by the system's APM BIOS. OEM event codes are in the range 0200h - 02FFh.
    ConsoleWrite("OEMEVENT" & @CRLF)
    Case $PBT_APMQUERYSUSPEND
    Local $actionFalgs = $lParam
    ;The action flags. If bit 0 is 1, the application can prompt the user for directions on how to prepare for the suspension; otherwise, the application must prepare without user interaction. All other bit values are reserved.

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

    ConsoleWrite("QUERYSUSPEND" & @CRLF)
    ; Return TRUE to grant the request to suspend. To deny the request, return BROADCAST_QUERY_DENY.
    ;Return $BROADCAST_QUERY_DENY
    Return True
    Case $PBT_APMQUERYSUSPENDFAILED
    ConsoleWrite("QUERYSUSPENDFAILED" & @CRLF)
    Case $PBT_APMRESUMECRITICAL
    ConsoleWrite("RESUMECRITICAL" & @CRLF)
    EndSwitch
    EndFunc

    [/autoit]
  • Super Ihr Zwei .

    Damit kann ich schon etwas anfangen .

    Danke für die schnelle Hilfe .

    Gruß CrazyEde

  • Hallo Zusammen,
    von mir auch ein Danke für das Skript. Nun hätte ich dazu eine Frage. Benutze das ganze auch für meinen HTPC und will jedenfalls sicherstellen das ein Programm vor dem Standby geschlossen wird. Nun kann der Standby auch (nach einer Aufnahme) automatisch ausgelöst werden. Also muss ich quasi abfangen wenn der Rechner in den Standby will und prüfen ob das Programm läuft und es gegebenfalls beenden.

    Habe dafür einfach mal folgendes in Zeile 33 eingefügt

    [autoit]


    Global Const $WM_POWERBROADCAST = 0x218
    Global Const $PBT_APMPOWERSTATUSCHANGE = 0xA ; Power status has changed.
    Global Const $PBT_APMRESUMEAUTOMATIC = 0x12 ; Operation is resuming automatically from a low-power state. This message is sent every time the system resumes.
    Global Const $PBT_APMRESUMESUSPEND = 0x7 ;Operation is resuming from a low-power state. This message is sent after PBT_APMRESUMEAUTOMATIC if the resume is triggered by user input, such as pressing a key.
    Global Const $PBT_APMSUSPEND = 0x4 ; System is suspending operation.
    Global Const $PBT_POWERSETTINGCHANGE = 0x8013 ; A power setting change event has been received.

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

    ; Windows Server 2003, Windows XP, and Windows 2000: The following event identifiers are also supported.
    Global Const $PBT_APMBATTERYLOW = 0x9 ; Battery power is low. In Windows Server 2008 and Windows Vista, use PBT_APMPOWERSTATUSCHANGE instead.
    Global Const $PBT_APMOEMEVENT = 0xB ; OEM-defined event occurred. In Windows Server 2008 and Windows Vista, this event is not available because these operating systems support only ACPI; APM BIOS events are not supported.
    Global Const $PBT_APMQUERYSUSPEND = 0x0 ; Request for permission to suspend. In Windows Server 2008 and Windows Vista, use the SetThreadExecutionState function instead.
    Global Const $PBT_APMQUERYSUSPENDFAILED = 0x2 ; Suspension request denied. In Windows Server 2008 and Windows Vista, use SetThreadExecutionState instead.
    Global Const $PBT_APMRESUMECRITICAL = 0x6 ; Operation resuming after critical suspension. In Windows Server 2008 and Windows Vista, use PBT_APMRESUMEAUTOMATIC instead.
    Global Const $BROADCAST_QUERY_DENY = 0x424D5144

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

    GUICreate("Event Receiver")
    GUIRegisterMsg($WM_POWERBROADCAST,"MY_WM_POWERBROADCAST")
    While 1
    Sleep(100)
    WEnd
    Func MY_WM_POWERBROADCAST($hWnd, $uMsg, $wParam, $lParam)
    ; Beschreibgungen auf http://msdn.microsoft.com/en-us/library/aa373247(VS.85).aspx
    Switch $wParam
    Case $PBT_APMPOWERSTATUSCHANGE
    ConsoleWrite("POWERSTATUSCHANGE" & @CRLF)
    Case $PBT_APMRESUMEAUTOMATIC
    ConsoleWrite("RESUMEAUTOMATIC" & @CRLF)
    Case $PBT_APMRESUMESUSPEND
    ConsoleWrite("RESUMESUSPEND" & @CRLF)
    Case $PBT_APMSUSPEND
    ConsoleWrite("SUSPEND" & @CRLF)
    If ProcessExists("app.exe") then ProcessClose("app.exe")
    Case $PBT_POWERSETTINGCHANGE
    Local $POWERBROADCAST_SETTING = DllStructCreate("byte[16] PowerSetting; DWORD DataLength; ushort Data;",$lParam)
    ConsoleWrite("POWERSETTINGCHANGE" & @CRLF)
    Case $PBT_APMBATTERYLOW
    ConsoleWrite("BATTERYLOW" & @CRLF)
    Case $PBT_APMOEMEVENT
    Local $OEM_event = $lParam ; The OEM-defined event code that was signaled by the system's APM BIOS. OEM event codes are in the range 0200h - 02FFh.
    ConsoleWrite("OEMEVENT" & @CRLF)
    Case $PBT_APMQUERYSUSPEND
    Local $actionFalgs = $lParam
    ;The action flags. If bit 0 is 1, the application can prompt the user for directions on how to prepare for the suspension; otherwise, the application must prepare without user interaction. All other bit values are reserved.

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

    ConsoleWrite("QUERYSUSPEND" & @CRLF)
    ; Return TRUE to grant the request to suspend. To deny the request, return BROADCAST_QUERY_DENY.
    ;Return $BROADCAST_QUERY_DENY
    Return True
    Case $PBT_APMQUERYSUSPENDFAILED
    ConsoleWrite("QUERYSUSPENDFAILED" & @CRLF)
    Case $PBT_APMRESUMECRITICAL
    ConsoleWrite("RESUMECRITICAL" & @CRLF)
    EndSwitch
    EndFunc

    [/autoit]

    Das funktioniert sogar aber ich kann halt nicht abschätzen ob das nicht irgendwelche anderen Auswrikungen hat. Würdet ihr das anders lösen?

    Danke und Grüße

    Alex

  • Ein Auto-it Überwachungsskript müsste ja immer im Hintergrund mitlaufen. Finde ich eigentlich am htpc nicht so gut.
    Verwendest du Eventghost? Damit sollte sich das auch lösen lassen. Oder du wählst nach der Aufnahme eine andere Aktion (Programm beenden, Anwendung ausführen) und lässt dein Skript oder Windows den Rest erledigen.

  • Hallo,

    also ich habe sowieso ein Hintergrund Skript am Laufen welches z.B. den USB Anschluss überwacht oder das Einlegen einer CD/DVD/Blu-Ray. In das könnte ich es halt mit reinfriemeln. Und naja ein sauberes Skript was ständig im Hintergrund läuft sollte eigentlich kaum stören. Die Rechenleistung einer CPU heuzutage ist so gigantisch da fällt das nicht mal ansatzweise ins GEwicht.

    Aktio nach einer Aufnahme gibt es mehrere beim DVBviewer und sicher ließe sich auch ein Programm starten aber damit bringt man doch recht leicht die Automatik des Programms durcheinander. (was passiert wenn eine weitere Aufnahme ansteht usw.)

    Also am liebsten wäre mir der Weg mit einer Hintergrundüberwachung, nur wie gesagt weiß ich nicht ob ich mir damit nicht irgendetwas anderes einfange

    Danke und Grüße

    Alex

  • Du kannst auch prüfen ob der DVBViewer gerade eine aufnimmt oder ob eine Aufnahme ansteht.
    Diese Infos bekommt man über den Com-Server, bei Bedarf hab ich zuhause auch ein Beispiel dazu.

    Edit \ Du kannst doch nach einer Aufnahme den DVBV schließen und Windows geht dann selbst in den Standby? Den selbst ausgelösten Standby löst du über ein Skript, dass zuerst den DVBV beendet, den Standby auslöst und nach dem Aufwachen den DVBV wieder startet.

    Und hier die Aufnahmeprüfung:

    Spoiler anzeigen
    [autoit]


    #include <Date.au3>
    Global $dvbviewer
    _Connect()
    _CheckRecording()
    Func _Connect()
    $DVBViewer = ObjGet("", "DVBViewerServer.DVBViewer") ;Verbindung zum DVBViewer herstellen
    If $DVBViewer = 0 Then
    MsgBox(1, "", "Keine Verbindung zum DVBViewer möglich")
    Exit
    EndIf
    EndFunc ;==>_Connect

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

    Func _CheckRecording() ;Prüft eine Aufnahme läuft oder ob zeitnah Aufnahmen (15min) anstehen
    ; nuts (http://www.autoit.de)
    Dim $dummy = 0
    Local $checkrecording = $DVBViewer.TimerManager.Recording()
    Switch $checkrecording
    Case True
    $dummy = 1
    Case Else
    Local $checktimer = $DVBViewer.TimerManager.NextRecordingTime()
    MsgBox(1, "", $checktimer)
    If $checktimer <> 18991230000000 And _DateTimeCheck($checktimer) = 1 Then $dummy = 2
    EndSwitch
    Switch $dummy ; wie du darauf reagieren willst bleibt dir überlassen, ist jetzt aus einem meiner Skripte rauskopiert
    Case 1
    Local $yesno1 = $DVBViewer.OSD.showyesno("WakeUp", "Achtung - Aufnahme läuft!", "Aktion trotzdem ausführen?", "", False)
    If $yesno1 = False Then _CheckSleeptimter()
    Case 2
    Local $yesno2 = $DVBViewer.OSD.showyesno("WakeUp", "Achtung - Aufnahme startet in weniger als 15 Minuten!", "Aktion trotzdem ausführen?", "", False)
    If $yesno2 = False Then _CheckSleeptimter()
    EndSwitch
    EndFunc ;==>_CheckRecording

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

    Func _DateTimeCheck($data)
    Local $formatdata = StringRegExpReplace($data, "(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})", "\1/\2/\3 \4:\5:\6")
    Local $current = @YEAR & "/" & @MON & "/" & @MDAY & " " & @HOUR & ":" & @MIN & ":" & @SEC
    If _DateDiff($current, $formatdata, "n") < 16 Then Return 1
    EndFunc ;==>_DateTimeCheck

    [/autoit]

    2 Mal editiert, zuletzt von nuts (7. Dezember 2009 um 12:20)

  • Hallo nochmals,

    danke für deine Mühen.

    Das ganze hört sich schonmal sehr gut an. Allerdings hab ich eins noch nicht verstanden. Situation ist: Recservice und DVBViewer laufen auf einem Rechner. Nach der Aufnahme fährt der REcservice den Rechner in den Standby. Aber wie soll sich der DVBViewer dann beenden. Man bräuchte eigentlich einen Trigger nach einer Aufnahme der den DVBViewer schließt. So einen hab ich noch nicht gefunden.

    Oder wie löst du den Triger nach der beendeten Aufnahme aus.

    Grüße

    Alex

  • Hm weiss leider grad nicht so ganz wie du es gerne hättest.
    Der DVBV wird ja für eine Aufnahme vom Recordingservice (RS) nicht gestartet, dieser macht alles ganz allein und benötigt auch keine Hilfe von einem Skript.

    Du willst unterscheiden wer den Rechner geweckt hat? War man es selbst -> DVBV starten, war es der RS -> soll dieser selbst die Aktion bestimmen ?

    P.S. Bei mir läuft der RS auf einem richtigen 24/7 Server und den Client schicke ich ausschließlich selbst in den Standby Modus (über ein Skript mit verschiedenen Funktion, DVBV schließen ist eine davon).