Shutdown überprüfen?

  • Hallo,

    ich will einen Process mit ProcessClose() beenden, bevor der PC in den Ruhezustand geht. Allerdings nicht beim drücken durch den Windows-Schalter, sondern bei mechanischer Betätigung des PC-Knopfes.
    Das Programm soll daraufhin reagieren, sofort den Prozess beenden und 10 sek warten bevor er mit dem herunterfahren bzw. Ruhezustand "weitermacht".
    Ist so etwas überhaupt beim mechanischen Ausschalten möglich?

    Mit freundlichen Grüßen
    supaburn

  • meinst du mit mechanischem ausschalten, wenn der PC schon runtergefahren ist, oder wenn er noch läuft?1
    Weil wenn Windows down ist glaube ich kaum, dass du mit AutoIt noch etwas machen kannst...
    mfg

    [autoit]


    While $Life = True
    $nMSG = BrainGetMsg()
    Switch $nMSG
    Case $Idea
    _Convert_Idea2Code()
    EndSwitch
    WEnd

    [/autoit]
  • wow das ging ja schnell...

    nein wenn der pc noch läuft und der mechanische "AUS"-Knopf gedrückt wird. Das programm soll erkennen das er jetzt in den Ruhezustand muss aber davor noch etwas zu tun hat -> Prozess beenden.
    Wird dabei die shutdown.exe aufgerufen?Könnte man die auf Aktivität oder Aufruf prüfen?

  • Unter Vista / Win7 (WinXP SP3?) können Anwendungen einen Systembefehl wie "Ruhezustand" nicht mehr verhindern/verzögern.
    D.h. mit den 10 Sekunden verzögern wirds schwierig.

    Den Befehl zum Ruhezustand abfangen geht über WM_POWERBROADCAST
    Vielleicht hilft das hier: http://msdn.microsoft.com/en-us/library/aa373247(VS.85).aspx ?

    Bsp. wie man WM_POWERBROADCAST verwenden kann:

    Spoiler anzeigen
    [autoit]


    Global $WM_POWERBROADCAST = 536
    Global $PBT_APMRESUMESUSPEND = 0x0007

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

    $hGUI = GUICreate("", 1, 1, 1, 1)
    GUIRegisterMsg($WM_POWERBROADCAST, "Standby")
    GUISetState(@SW_HIDE, $hGUI)

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

    While 1
    $GUIMsg = GUIGetMsg()
    Switch $GUIMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

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

    Func Standby($hWnd, $Msg, $wParam, $lParam) ;für die aktion nach dem standby/ruhezustand
    Switch $wParam
    Case $PBT_APMRESUMESUSPEND
    MsgBox(1, "", "Bin grad aufgewacht")
    Exit
    EndSwitch
    EndFunc ;==>Standby

    [/autoit]

    Edit \ Bzw. verhindern könnte noch klappen.
    Befehl abfangen -> verhindern -> Aktionen -> warten -> selbst den Ruhezustand auslösen.

    Einmal editiert, zuletzt von nuts (25. November 2009 um 00:45)

  • das ist ja schonmal ein guter Anfang.
    aber in dem Beispielskript macht es irgendwas beim hochfahren aus dem standby (laut msdn) oder?
    der richtige befehl wäre PBT_APMSUSPEND4 (0x4).
    also zusammengefasst:
    skript schreiben das ständig im hintergrund läuft und auf PBT_APMPOWERSTATUSCHANGE überprüft, wenn PBT_APMSUSPEND ausgelöst wird dann Process beenden.
    Richtig so?

  • Ja genau, dass ist nur ein Bsp. aus meinem Archiv (Zweck haste richtig erkannt) für WM_POWERBROADCAST damit du heute nacht bissle basteln kannst.
    Das ist mit den neueren OS etwas "verwirrend" geworden.

  • ja danke hab nachts noch ein wenig getippt jetzt steh ich vor einem Problem.
    Ich will ja das das Skript beim Windows-Start aktiviert wird und ständig im Hintergrund auf das Event wartet, nur wie gehts?

  • Das blöde jetzt: Es muss auf Vista x32 laufen...
    Ist es möglich?
    hab jetzt mal folgenden Code:

    Bei $GUI_EVENT_CLOSE kommt ein Fehler beim kompilieren?
    Stimmt der Rest?


    Danke für die Hilfe.

  • Wenn dein Skript immer über das System wacht läuft es quasi durchgehend (vermutlich wird der PC gar nicht/selten heruntergefahren um das Aufwecken per Fernbedienung zu ermöglichen?).
    Und ein Autoitscript 24/7 mitlaufen zu lassen? Naja ich weiss nicht ...

    Es gibt ein besseres Konzept: Man bastelt ein kleines Programm, dass vom DVBViewer gestartet wird und die gewünschten Befehle ausführt. Auch das "Erweiterte Beenden" Menü kann man per Autoit nachbauen und mit eigenen Befehlen füllen.
    Dazu hab ich ne Menge Bsp. zuhause, werde heute abend mal eins posten.

    P.S. in deinem Skript fehlt vermutlich nur

    [autoit]

    #include<GUIConstantsEx.au3>

    [/autoit]
  • ja genau darauf wollte ich auch hinaus (was du dann als "Autostart" verstanden hast).Ich meinte damit eigentlich das das Skript ja ständig zur Überwachung im Hintergrund laufen müsste.
    Wie gesagt, DVBViewer soll beendet werden wenn der PC in den Ruhezustand will.
    Wär cool wenn du was hast;)
    Ich schau mir jetzt mal DVBViewer genauer an.

    Danke

  • Wer löst den Ruhezustand aus? Der DVBViewer? Oder wie?

    Sollte der Ruhezustand extern ausgelöst werden muss man natürlich schon durchgehend überwachen.
    Nur wer führt ungefragt den Ruhezustand aus? Beim User kann man die Konfig. ja beeinflussen, d.h. anstatt direkt den Ruhezustand auszulösen wird eben ein Autoit Skript aufgerufen.

    Edit \ Hier mal einen kleines Prog. das ich für den DVBViewer verwende.
    Angehängt die benötigte .txt Datei.

    Spoiler anzeigen
    [autoit]


    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=..\WakeUP-test\Windows-Stand-By.ico
    #AutoIt3Wrapper_UseUpx=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <Array.au3>
    #include <Date.au3>
    #include <File.au3>
    #include <Misc.au3>
    #include<string.au3>
    #include <Guilistview.au3>

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

    Opt('WinTitleMatchMode', 3)

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

    Global Const $TITLE_RECEIVER = 'DVBV_Tools'
    Global $NewDataAvailable = False, $avData[1]
    Global $DVBViewer, $iCounter
    Global $ini = @AppDataCommonDir & "\DVB-Tools.ini"
    Global $log = @AppDataCommonDir & "\DVB-Tools.log"
    Global $timerstate = False
    Global $path, $xml

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

    Global $setupgui, $ListView, $hlistview, $Bselect, $Binstall

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

    Global $WM_POWERBROADCAST = 536
    Global $PBT_APMRESUMESUSPEND = 0x0007
    Global $install = @TempDir & "\DVB-Tools.ini"
    FileInstall('C:\Dokumente und Einstellungen\Nussman\Eigene Dateien\autoitskripte\HTPC\dvbviewer\allinone\dvb-tools.ini', $install)

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

    If WinExists($TITLE_RECEIVER) Then
    If $CMDLINE[0] = 0 Then Exit
    _SendData(WinGetHandle($TITLE_RECEIVER), $CMDLINERAW)
    Exit
    Else
    If _Singleton($TITLE_RECEIVER, 1) = 0 Then Exit
    If $CMDLINE[0] > 0 Then
    _CreateIni()
    Switch $CMDLINE[1]
    Case "-devcon"
    _Devcon()
    Exit
    Case "-display"
    exit
    Case "-end"
    _End()
    Case "-sleep"
    _Sleeptimer()
    Case "-notnagel"
    exit
    Case "-setup"
    _Setup()
    case "-konfig"
    _Konfig()
    EndSwitch
    EndIf
    EndIf
    Exit

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

    Func _Receiver()
    $timerstate = True
    AdlibEnable('_Countdown', 60000)
    GUICreate($TITLE_RECEIVER)
    GUIRegisterMsg($WM_COPYDATA, '_WM_COPYDATA')
    While 1
    If $iCounter <= 0 Then
    AdlibDisable()
    _Beenden()
    Exit
    EndIf
    Sleep(10)
    If $NewDataAvailable Then
    $NewDataAvailable = False
    $sMsg = $avData[1]
    _ArrayDelete($avData, 1)
    $aMsg = _ParseCMDLine($sMsg)
    For $i = 0 To UBound($aMsg) - 1
    Switch $aMsg[$i][1]
    Case "sleep"
    _STOPTimer()
    Case "devcon"
    _Devcon()
    Case "end"
    _End()
    Case "display"
    EndSwitch
    Next
    EndIf
    WEnd

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

    GUIDelete()
    EndFunc ;==>_Receiver

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

    ;===============================================================================
    ;
    ; Function Name: _ParseCMDLine($CMDString)
    ; Description:: Parses a CMD-String to Parameters with Values
    ; Parameter(s): $CMDString -> String to parse
    ; Requirement(s): ?
    ; Return Value(s): Error: 0 and @error = StringRegExp-Error
    ; Success: 2 Dimensional Array:
    ; $array[$i][0] : Parameter including value
    ; $array[$i][1] : Parameter
    ; $array[$i][2] : Value with quotation marks (only if value has quotaion marks)
    ; $array[$i][3] : Value without quotation marks
    ; Author(s): Prog@ndy
    ;
    ; Basis: http://regexlib.com/REDetails.aspx?regexp_id=1220
    ;===============================================================================
    ;
    Func _ParseCMDLine($CMDString)
    Local $y, $j, $i, $entry
    Local $x = StringRegExp($CMDString, '(?:\s*)(?<=[-|/])(?<name>[^\s-|/:|=]*)(?:(?:[:|=](?:("(?<value1>.*?)(?<!\\)")|(?<value>\S*)))|\w*?)', 4)
    If @error Then Return SetError(@error, 0, 0)
    Local $ResultArray[UBound($x)][4]
    For $i = 0 To UBound($x) - 1
    $entry = $x[$i]
    For $y = 0 To UBound($entry) - 1
    $j = $y
    If $y > 3 Then $j = 3
    $ResultArray[$i][$j] = $entry[$y]
    Next
    Next
    Return $ResultArray
    EndFunc ;==>_ParseCMDLine

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

    Func _SendData($hWnd, $sData)
    Local $tCOPYDATA, $tMsg

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

    $tMsg = DllStructCreate('wchar[' & StringLen($sData) + 1 & ']')
    DllStructSetData($tMsg, 1, $sData)
    $tCOPYDATA = DllStructCreate('dword;dword;ptr')
    DllStructSetData($tCOPYDATA, 2, DllStructGetSize($tMsg))
    DllStructSetData($tCOPYDATA, 3, DllStructGetPtr($tMsg))
    $Ret = DllCall('user32.dll', 'lparam', 'SendMessageW', 'hwnd', $hWnd, 'int', $WM_COPYDATA, 'wparam', 0, 'lparam', DllStructGetPtr($tCOPYDATA))
    If (@error) Or ($Ret[0] = -1) Then
    Return 0
    EndIf
    Return 1
    EndFunc ;==>_SendData

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

    Func _WM_COPYDATA($hWnd, $msgID, $wParam, $lParam)

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

    Local $tCOPYDATA = DllStructCreate('dword;dword;ptr', $lParam)
    Local $tMsg = DllStructCreate('wchar[' & DllStructGetData($tCOPYDATA, 2) / 2 & ']', DllStructGetData($tCOPYDATA, 3))

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

    _ArrayAdd($avData, DllStructGetData($tMsg, 1))
    $NewDataAvailable = True

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

    Return 0
    EndFunc ;==>_WM_COPYDATA

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

    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 _Devcon()
    Local $skey
    If Not FileExists(@ScriptDir & "\devcon\i386\devcon.exe") Then
    _FileWriteLog($log, "Devcon.exe nicht gefunden")
    _CheckSleeptimter()
    Return
    EndIf
    _Connect()
    Local $areadini = IniReadSection($ini, "Devcon")
    If @error Then
    _FileWriteLog($log, "Ini / Sektion 'Devcon' leer oder nicht gefunden")
    Local $areadini[1][1]
    $areadini[0][0] = 0
    $skey &= "Zurück"
    Else
    For $i = 1 To $areadini[0][0]
    $skey &= $areadini[$i][0] & ", "
    Next
    $skey &= "Zurück"
    EndIf
    Local $osd = $DVBViewer.OSD.showpopup("Devcon", $skey, True) ;OSD um abzufragen welche Hardware neu gesartet werden soll
    Switch $osd
    Case $areadini[0][0]
    $DVBViewer.SendCommand(82) ;osd zurück
    _CheckSleeptimter()
    Case Else
    $DVBViewer.SendCommand(16383) ;schließe graph
    _Refresh($areadini[$osd + 1][1])
    $DVBViewer.SendCommand(63) ;last channel
    EndSwitch
    EndFunc ;==>_Devcon

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

    Func _Refresh($ID) ;führt Devcon mit der übergebenen ID aus
    $ID = "@" & $ID
    RunWait(@ScriptDir & "\devcon\i386\devcon.exe" & ' disable ' & $ID, "", @SW_HIDE) ; deaktivieren
    Sleep(2000) ;2 Sekunden warten
    RunWait(@ScriptDir & "\devcon\i386\devcon.exe" & ' enable ' & $ID, "", @SW_HIDE) ; aktivieren
    EndFunc ;==>_Refresh

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

    Func _CheckSleeptimter() ;Prüft ob der Sleeptimer aktiv ist
    If $timerstate = False Then
    Exit
    EndIf
    EndFunc ;==>_CheckSleeptimter

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

    Func _Sleeptimer()
    _Connect() ;Verbindung zum DVBViewer herstellen
    local $showosd = $DVBViewer.OSD.showpopup("Sleeptimer", " 30min, 60min, 90min, 120min, 180min, Zurück", True) ;OSD um abzufragen wie lange der Sleeptimer laufen soll
    Switch $showosd
    Case 0
    $iCounter = 30
    _Receiver()
    Case 1
    $iCounter = 60
    _Receiver()
    Case 2
    $iCounter = 90
    _Receiver()
    Case 3
    $iCounter = 120
    _Receiver()
    Case 4
    $iCounter = 180
    _Receiver()
    Case 5
    $DVBViewer.SendCommand(82) ;osd zurück
    Exit
    EndSwitch
    EndFunc ;==>_Sleeptimer

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

    Func _STOPTimer()
    Local $stop = $DVBViewer.OSD.showyesno("Sleeptimer", "Restlaufzeit:" & $iCounter, "Countdown abbrechen?", "", True) ;OSD Fenster mit der verbleibenden Zeit wird und einer Abfrage wird angezeigt
    Switch $stop
    Case True
    Exit
    EndSwitch
    EndFunc ;==>_STOPTimer

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

    Func _Countdown()
    $iCounter -= 1
    EndFunc ;==>_Countdown

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

    Func _Beenden() ;Sleeptimer
    Local $aktion = IniRead($ini, "Sleeptimer", "Aktion", "32")
    If @error Then
    _FileWriteLog($log, "Sektion 'Sleeptimer' oder Key 'Aktion' nicht einlesbar! -> Standby verwendet!")
    EndIf
    Switch $aktion
    Case 1
    _Shutdown()
    Case 2
    _Reboot()
    Case 32
    _Standby()
    Case 64
    _Hibernate()
    EndSwitch
    Exit
    EndFunc ;==>_Beenden

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

    Func _End()
    Local $end
    _Connect()
    Local $endGUI = GUICreate("", 1, 1, 1, 1)
    GUIRegisterMsg($WM_POWERBROADCAST, "_Wakeup")
    GUISetState(@SW_HIDE, $endGUI)

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

    $end = $DVBViewer.OSD.showpopup("Erweitertes Beenden", " Ausschalten, Standby, Ruhemodus, PC neu Starten, Zurück", True)
    Switch $end
    Case 0
    _Shutdown()
    Exit
    Case 1
    _Standby()
    Case 2
    _Hibernate()
    Case 3
    _Reboot()
    Exit
    Case 4
    $DVBViewer.SendCommand(82) ;osd zurück
    _CheckSleeptimter()
    Return
    EndSwitch
    While 1
    $GUIMsg = GUIGetMsg()
    Switch $GUIMsg
    Case $GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd

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

    Exit
    EndFunc ;==>_End

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

    Func _Wakeup($hWnd, $Msg, $wParam, $lParam) ;für die aktion nach dem standby/ruhezustand
    local $Lmsg
    Switch $wParam
    Case $PBT_APMRESUMESUSPEND
    Sleep(IniRead($ini, "Sleep", "Nach", "")) ;Bei Problemen in der Ini eine Wartezeit eintragen
    ShellExecute(IniRead($ini, "WakeUp", "Run", ""), IniRead($ini, "WakeUp", "Parameter", ""))
    Exit
    EndSwitch
    EndFunc ;==>_Wakeup

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

    Func _CloseDVBViewer()
    $DVBViewer.SendCommand(12326) ;dvbviewer beenden
    ProcessWaitClose("dvbviewer.exe", 10) ; warten bis der dvbviewer beendet ist oder nach 10 sekunden weiter im skript
    ProcessWaitClose("Scheduler.exe", 10) ;warten bis der scheduler beendet ist oder nach 10 sekunden weiter im skript

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

    If WinExists("DVB Viewer") Then ;DvbViewer killen wenns über den Com-Befehl nicht geklappt hat
    WinClose("DVB Viewer")
    Sleep(3000)
    EndIf
    If WinExists("DVB Viewer") Then
    WinKill("DVB Viewer")
    Sleep(3000)
    EndIf
    If ProcessExists("dvbviewer.exe") Then
    ProcessClose("dvbviewer.exe")
    EndIf
    EndFunc ;==>_CloseDVBViewer

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

    Func _SendCommand()
    $iactions = IniReadSection($ini, "actions")
    If @error Then
    MsgBox(4096, "", "Ini oder Section nicht gefunden")
    Else
    For $i = 1 To $iactions[0][0] ;Schleife um alle Einträge in der .ini durchzugehen
    $DVBViewer.SendCommand($iactions[$i][1])
    Sleep(100) ; gibt dem Dvbviewer Zeit zum Atmen -> kann man auch ohne testen!
    Next
    EndIf
    EndFunc ;==>_SendCommand

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

    Func _Shutdown()
    Local $split
    If IniRead($ini, "Einstellungen", "Server", 0) <> 1 Then _CheckRecording()
    Local $aini = IniReadSection($ini, "Shutdown")
    If @error Then MsgBox(4096, "", "Ini oder Section nicht gefunden")
    If $aini[1][1] = 1 Then _SendCommand() ; _Sendcommand aufrufen
    _CloseDVBViewer() ;DVB Viewer beenden
    Switch $aini[2][1] ;Modus Abfrage
    Case 0 ;Shutdown Aktion
    Shutdown(1)
    Case 1 ;Externes Programm aufrufen und Skript beenden
    ShellExecute($aini[3][1], $aini[4][1])
    Exit
    Case 2 ;Externes Programm ausführen, drauf warten und anschließend die Shutdown Aktion durchführen
    ShellExecutewait($aini[3][1], $aini[4][1])
    Shutdown(1)
    EndSwitch
    EndFunc ;==>_Shutdown

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

    Func _Standby()
    Local $split
    If IniRead($ini, "Einstellungen", "Server", 0) <> 1 Then _CheckRecording()
    Local $aini = IniReadSection($ini, "Standby")
    If @error Then MsgBox(4096, "", "Ini oder Section nicht gefunden")
    If $aini[1][1] = 1 Then _SendCommand()
    _CloseDVBViewer() ;DVB Viewer beenden
    Sleep(IniRead($ini, "Sleep", "Vor", "")) ;;Bei Problemen nach dem Standby / Ruhezustand in der Ini eine Wartezeit eintragen
    Switch $aini[2][1] ;Modus Abfrage
    Case 0 ;Standby Aktion
    Shutdown(32)
    Case 1 ;Externes Programm aufrufen und Skript beenden
    ShellExecute($aini[3][1], $aini[4][1])
    Exit
    Case 2 ;Externes Programm ausführen, drauf warten und anschließend die Standby Aktion durchführen
    ShellExecuteWait($aini[3][1], $aini[4][1])
    Shutdown(32)
    EndSwitch
    EndFunc ;==>_Standby

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

    Func _Hibernate()
    Local $split
    If IniRead($ini, "Einstellungen", "Server", 0) <> 1 Then _CheckRecording()
    Local $aini = IniReadSection($ini, "Hibernate")
    If @error Then MsgBox(4096, "", "Ini oder Section nicht gefunden")
    If $aini[1][1] = 1 Then _SendCommand()
    Sleep(IniRead($ini, "Sleep", "Vor", "")) ;;Bei Problemen nach dem Standby / Ruhezustand in der Ini eine Wartezeit eintragen
    _CloseDVBViewer() ;DVB Viewer beenden
    Switch $aini[2][1] ;Modus Abfrage
    Case 0 ;Shutdown Aktion
    Shutdown(64)
    Case 1 ;Externes Programm aufrufen und Skript beenden
    ShellExecute($aini[3][1], $aini[4][1])
    Exit
    Case 2 ;Externes Programm ausführen, drauf warten und anschließend die Shutdown Aktion durchführen
    ShellExecutewait($aini[3][1], $aini[4][1])
    Shutdown(64)
    EndSwitch
    EndFunc ;==>_Hibernate

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

    Func _Reboot()
    Local $split
    If IniRead($ini, "Einstellungen", "Server", 0) <> 1 Then _CheckRecording()
    Local $aini = IniReadSection($ini, "Reboot")
    If @error Then MsgBox(4096, "", "Ini oder Section nicht gefunden")
    If $aini[1][1] = 1 Then _SendCommand()
    _CloseDVBViewer() ;DVB Viewer beenden
    Switch $aini[2][1] ;Modus Abfrage
    Case 0 ;Shutdown Aktion
    Shutdown(2)
    Case 1 ;Externes Programm aufrufen und Skript beenden
    ShellExecute($aini[3][1], $aini[4][1])
    Exit
    Case 2 ;Externes Programm ausführen, drauf warten und anschließend die Shutdown Aktion durchführen
    ShellExecute($aini[3][1], $aini[4][1])
    Shutdown(2)
    EndSwitch
    EndFunc ;==>_Reboot

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

    Func _CheckRecording() ;Prüft eine Aufnahme läuft oder ob zeitnah Aufnahmen (15min) anstehen
    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
    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] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CreateIni()
    Local $fopen, $fwrite, $fread
    If Not FileExists($ini) Then
    _FileCreate($ini)
    $fopen = FileOpen($install, 0)
    $fread = FileRead($fopen)
    FileClose($fopen)
    FileDelete($install)
    $fopen = FileOpen($ini, 2)
    FileWrite($fopen, $fread)
    FileClose($fopen)
    EndIf
    EndFunc ;==>_CreateIni

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

    Func _Setup()
    If ProcessExists("dvbviewer.exe") Then
    MsgBox(0, "DVBV_Tools-Setup", "DVBViewer gestartet" & @CRLF & "Setup nicht möglich - Bitte den DVBViewer beenden")
    Exit
    EndIf
    local $select
    $path = IniRead($ini, "Einstellungen", "DVBVSetupfolder", "")
    $setupgui = GUICreate("Setup DVBV_Tools", 600, 270, Default, Default)
    $ListView = GUICtrlCreateListView("Modul", 5, 64, 210, 126, BitOR($LVS_REPORT, $LVS_NOCOLUMNHEADER, $LVS_SINGLESEL, $LVS_SHOWSELALWAYS), BitOR($WS_EX_CLIENTEDGE, $LVS_EX_CHECKBOXES))
    $hlistview = GUICtrlGetHandle($ListView)
    _GUICtrlListView_SetColumn($hlistview, 0, "", 200, 0)
    GUICtrlCreateListViewItem("Erweitertes Beenden", $ListView)
    GUICtrlCreateListViewItem("Sleeptimer", $ListView)
    GUICtrlCreateListViewItem("Devcon", $ListView)
    GUICtrlCreateListViewItem("Display", $ListView)
    $ipath = GUICtrlCreateInput("Input1", 5, 16, 565, 21,$ES_READONLY)
    GUICtrlSetData($ipath, $path)
    $Bselect = GUICtrlCreateButton("...", 570, 16, 25, 21, 0)
    $Binstall = GUICtrlCreateButton(">>Installieren", 450, 220, 140, 40, 0)
    $einfo = GUICtrlCreateEdit('Erweitertes Beenden: Beenden mit verbesserter Kontrolle' & @CRLF & @CRLF & 'Sleeptimer: Alternativer Sleeptimer' & @CRLF & @CRLF &'Devcon: Devcon Aktionen aus dem DVB-Viewer ausführen' & @CRLF & @CRLF &'Display: Auflösung / Wiederholungsrate aus dem DVB-Viewer ändern' & @CRLF & @CRLF & 'Mehr Infos s. Readme',230, 64, 360, 126, BitOR($ES_AUTOVSCROLL,$ES_AUTOHSCROLL,$ES_READONLY,$ES_WANTRETURN))

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

    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Bselect
    $select = FileSelectFolder("Setupverzeichnis des DVBViewer auswählen", "C:\")
    if $select <> "" then
    $path=$Select
    IniWrite($ini, "Einstellungen", "DVBVSetupfolder", $path)
    GUICtrlSetData($ipath, $path)
    endif
    Case $Binstall
    _Install()
    EndSwitch
    WEnd
    EndFunc ;==>_Setup

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

    Func _Install()
    if not _Backupwindowdef() then Return
    If _GUICtrlListView_GetItemChecked($hlistview, 0) Then _InstallEnd()
    If _GUICtrlListView_GetItemChecked($hlistview, 1) Then _InstallSleep()
    If _GUICtrlListView_GetItemChecked($hlistview, 2) Then _InstallDevcon()
    If _GUICtrlListView_GetItemChecked($hlistview, 3) Then _InstallDisplay()
    MsgBox(0, "Setup DVBV_Tools", "Setup abgeschlossen")
    Exit
    EndFunc ;==>_Install

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

    Func _Backupwindowdef()
    $xml = $path & "\windowdef.xml"
    Local $des = @ScriptDir & "\Backup\windowsdef_backup.xml"
    If Not FileExists($xml) Then
    Local $Lmsg = $xml &" nicht gefunden"
    _FileWriteLog($log, $Lmsg)
    Return false
    Else
    If not FileExists($des) then FileCopy($xml, $des,8)
    EndIf
    Return true
    EndFunc ;==>_Backupwindowdef

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

    Func _InstallEnd()
    Local $open = FileOpen($xml, 0)
    Local $read = FileRead($xml)
    FileClose($open)
    Local $find = StringInStr($read, "</Windows>")

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

    Local $add
    $add &= @TAB & '<Window Name="DVBV_Tools" Text="Erweitertes Beenden" ID="-3" Parent="0">' & @CRLF
    $add &= @TAB & @TAB & '<Image></Image>' & @CRLF
    $add &= @TAB & @TAB & '<Application>' & @ScriptFullPath & '</Application>' & @CRLF
    $add &= @TAB & @TAB & '<Arguments>-end</Arguments>' & @CRLF
    $add &= @TAB & @TAB & '<Systemwin>0</Systemwin>' & @CRLF
    $add &= @TAB & '</Window>)' & @CRLF
    Local $send = _StringInsert($read, $add, $find - 1)
    $open = FileOpen($xml, 2)
    FileWrite($open, $send)
    FileClose($open)
    EndFunc ;==>_InstallEnd

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

    Func _InstallSleep()
    Local $open = FileOpen($xml, 0)
    Local $read = FileRead($xml)
    FileClose($open)
    Local $find = StringInStr($read, "</Windows>")

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

    Local $add
    $add &= @TAB & '<Window Name="DVBV_Tools" Text="Sleeptimer" ID="-3" Parent="0">' & @CRLF
    $add &= @TAB & @TAB & '<Image></Image>' & @CRLF
    $add &= @TAB & @TAB & '<Application>' & @ScriptFullPath & '</Application>' & @CRLF
    $add &= @TAB & @TAB & '<Arguments>-sleep</Arguments>' & @CRLF
    $add &= @TAB & @TAB & '<Systemwin>0</Systemwin>' & @CRLF
    $add &= @TAB & '</Window>)' & @CRLF
    Local $send = _StringInsert($read, $add, $find - 1)
    $open = FileOpen($xml, 2)
    FileWrite($open, $send)
    FileClose($open)
    EndFunc ;==>_InstallSleep

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

    Func _InstallDevcon()

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

    Local $open = FileOpen($xml, 0)
    Local $read = FileRead($xml)
    FileClose($open)
    Local $find = StringInStr($read, "</Windows>")

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

    Local $add
    $add &= @TAB & '<Window Name="DVBV_Tools" Text="Devcon" ID="-3" Parent="0">' & @CRLF
    $add &= @TAB & @TAB & '<Image></Image>' & @CRLF
    $add &= @TAB & @TAB & '<Application>' & @ScriptFullPath & '</Application>' & @CRLF
    $add &= @TAB & @TAB & '<Arguments>-devcon</Arguments>' & @CRLF
    $add &= @TAB & @TAB & '<Systemwin>0</Systemwin>' & @CRLF
    $add &= @TAB & '</Window>)' & @CRLF
    Local $send = _StringInsert($read, $add, $find - 1)
    $open = FileOpen($xml, 2)
    FileWrite($open, $send)
    FileClose($open)
    EndFunc ;==>_InstallDevcon

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

    Func _InstallDisplay()
    Local $open = FileOpen($xml, 0)
    Local $read = FileRead($xml)
    FileClose($open)
    Local $find = StringInStr($read, "</Windows>")

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

    Local $add
    $add &= @TAB & '<Window Name="DVBV_Tools" Text="Display" ID="-3" Parent="0">' & @CRLF
    $add &= @TAB & @TAB & '<Image></Image>' & @CRLF
    $add &= @TAB & @TAB & '<Application>' & @ScriptFullPath & '</Application>' & @CRLF
    $add &= @TAB & @TAB & '<Arguments>-display</Arguments>' & @CRLF
    $add &= @TAB & @TAB & '<Systemwin>0</Systemwin>' & @CRLF
    $add &= @TAB & '</Window>)' & @CRLF
    Local $send = _StringInsert($read, $add, $find - 1)
    $open = FileOpen($xml, 2)
    FileWrite($open, $send)
    FileClose($open)
    EndFunc ;==>_InstallDisplay

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

    Func _Konfig()
    ShellExecute($ini)
    Exit
    EndFunc

    [/autoit]


    Ist jetzt für den Einsatz ohne eigenes Gebastel noch nicht ganz ausgereift, aber vielleicht kannste dir paar interessante Sachen abkucken.