FIlm abspielen mit Shellexecute

  • Für meine vielen Filme habe ich mir ein Programm gebastelt, dass die Filme alle auflistet. Wenn man auf einen Film klickt, kann man Bilder dazu sehen, Infos, und einen Trailer bzw. den Film starten. Das Problem ist nur, dass ShellExecute in Verbindung mit mpg Videos folgenden Fehler gibt:
    [Blockierte Grafik: http://img3.imagebanana.com/img/4096xjvv/Screenshot25.06.200916_44_44.png]
    Obwohl mpg klar dem VLC Player zugeordnet sind. Wenn ich die Filme, wie in der Meldung beschrieben, neu zuordne, ändert sich nichts.
    Wie öffne ich also die FIlme?
    (Ich wollte jetzt nicht durch VLC starten und diversen Kontrolklicks ans Ziel gelanden, aber wenn es keine Alternative gibt, würde ich das machen.)

    Spoiler anzeigen
    [autoit]

    Dim $vOldFilm

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

    $hGUI = GUICreate("Movies", 1000, 600)
    GUISetBkColor(0x000000)

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

    $hGUIEditInformation = GUICtrlCreateEdit("", 0, 0, 300, 580)
    GUICtrlSetBkColor(-1, 0x000000)
    GUICtrlSetColor(-1, 0xFFFFFF)
    $hGUIButtonSaveTxt = GUICtrlCreateButton("Änderungen speichern", 0, 580, 300, 20)

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

    $hGUIPicFilm = GUICtrlCreatePic("", 300, 0, 500, 600, 0x0200)
    GUICtrlSetBkColor(-1, 0x000000)
    $hGUIButtonPic1 = GUICtrlCreateButton("1", 300, 580, 92, 20)
    $hGUIButtonPic2 = GUICtrlCreateButton("2", 402, 580, 92, 20)
    $hGUIButtonPic3 = GUICtrlCreateButton("3", 504, 580, 92, 20)
    $hGUIButtonPic4 = GUICtrlCreateButton("4", 606, 580, 92, 20)
    $hGUIButtonPic5 = GUICtrlCreateButton("5", 708, 580, 92, 20)

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

    $hGUIList = GUICtrlCreateList("", 800, 0, 200, 570)
    GUICtrlSetBkColor(-1, 0x000000)
    GUICtrlSetColor(-1, 0xFFFFFF)
    $hGUIButtonRefreshList = GUICtrlCreateButton("Filmliste erneuern", 800, 565, 200, 18)
    $hGUIButtonTrailer = GUICtrlCreateButton("Trailer", 800, 583, 100, 18)
    $hGUIButtonFilm = GUICtrlCreateButton("Film", 900, 583, 100, 18)

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

    _GetMovies()
    GUISetState(@SW_SHOW, $hGUI)

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

    While 1
    Switch GUIGetMsg()
    Case - 3
    Exit
    Case $hGUIButtonRefreshList
    GUICtrlSetData($hGUIList, "")
    GUICtrlSetData($hGUIPicFilm, "")
    _GetMovies()
    Case $hGUIButtonPic1
    GUICtrlSetImage($hGUIPicFilm, @ScriptDir & "\" & GUICtrlRead($hGUIList) & "\" & "Cover1.jpg")
    GUICtrlSetFont($hGUIButtonPic2, 10)
    GUICtrlSetFont($hGUIButtonPic3, 10)
    GUICtrlSetFont($hGUIButtonPic4, 10)
    GUICtrlSetFont($hGUIButtonPic5, 10)
    GUICtrlSetFont($hGUIButtonPic1, 14)
    Case $hGUIButtonPic2
    GUICtrlSetImage($hGUIPicFilm, @ScriptDir & "\" & GUICtrlRead($hGUIList) & "\" & "Cover2.jpg")
    GUICtrlSetFont($hGUIButtonPic1, 10)
    GUICtrlSetFont($hGUIButtonPic3, 10)
    GUICtrlSetFont($hGUIButtonPic4, 10)
    GUICtrlSetFont($hGUIButtonPic5, 10)
    GUICtrlSetFont($hGUIButtonPic2, 14)
    Case $hGUIButtonPic3
    GUICtrlSetImage($hGUIPicFilm, @ScriptDir & "\" & GUICtrlRead($hGUIList) & "\" & "Cover3.jpg")
    GUICtrlSetFont($hGUIButtonPic1, 10)
    GUICtrlSetFont($hGUIButtonPic2, 10)
    GUICtrlSetFont($hGUIButtonPic4, 10)
    GUICtrlSetFont($hGUIButtonPic5, 10)
    GUICtrlSetFont($hGUIButtonPic3, 14)
    Case $hGUIButtonPic4
    GUICtrlSetImage($hGUIPicFilm, @ScriptDir & "\" & GUICtrlRead($hGUIList) & "\" & "Cover4.jpg")
    GUICtrlSetFont($hGUIButtonPic1, 10)
    GUICtrlSetFont($hGUIButtonPic2, 10)
    GUICtrlSetFont($hGUIButtonPic3, 10)
    GUICtrlSetFont($hGUIButtonPic5, 10)
    GUICtrlSetFont($hGUIButtonPic4, 14)
    Case $hGUIButtonPic5
    GUICtrlSetImage($hGUIPicFilm, @ScriptDir & "\" & GUICtrlRead($hGUIList) & "\" & "Cover5.jpg")
    GUICtrlSetFont($hGUIButtonPic1, 10)
    GUICtrlSetFont($hGUIButtonPic2, 10)
    GUICtrlSetFont($hGUIButtonPic3, 10)
    GUICtrlSetFont($hGUIButtonPic4, 10)
    GUICtrlSetFont($hGUIButtonPic5, 14)
    Case $hGUIButtonTrailer
    $vFilmTrailer = GUICtrlRead($hGUIList)
    ShellExecute(@ScriptDir & "\" & $vFilmTrailer & "\" & $vFilmTrailer & "_Trailer.mpg")
    Case $hGUIButtonFilm
    $vFilmX = GUICtrlRead($hGUIList)
    ShellExecute(@ScriptDir & "\" & $vFilmX & "\" & $vFilmX & ".mpg")
    Case $hGUIButtonSaveTxt
    $vPath = @ScriptDir & "\" & GUICtrlRead($hGUIList) & "\" & "Info.txt"
    FileDelete($vPath)
    FileWrite($vPath, GUICtrlRead($hGUIEditInformation))
    EndSwitch
    Sleep(5)
    $vFilm = GUICtrlRead($hGUIList)
    If $vFilm <> $vOldFilm Then
    $vFilmDir = @ScriptDir & "\" & $vFilm & "\"
    GUICtrlSetData($hGUIEditInformation, FileRead($vFilmDir & "Info.txt"))
    GUICtrlSetImage($hGUIPicFilm, $vFilmDir & "Cover1.jpg")
    GUICtrlSetFont($hGUIButtonPic2, 10)
    GUICtrlSetFont($hGUIButtonPic3, 10)
    GUICtrlSetFont($hGUIButtonPic4, 10)
    GUICtrlSetFont($hGUIButtonPic5, 10)
    GUICtrlSetFont($hGUIButtonPic1, 14)
    $vOldFilm = $vFilm
    EndIf
    WEnd

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

    Func _GetMovies()
    $folders = _GetFilesFolder_Rekursiv('.', Default, 1, 0)
    For $i = 1 To $folders[0]
    $vDirContainer = StringSplit(StringReplace($folders[$i], @ScriptDir & "\", ""), "\")
    GUICtrlSetData($hGUIList, $vDirContainer[1])
    Next
    EndFunc ;==>GetFolders

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc ;==>_GetFilesFolder_Rekursiv

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

    Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $Delim = @CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc ;==>_ShowSubFolders

    [/autoit]

    Einmal editiert, zuletzt von NoName (26. Juni 2009 um 12:47)

  • ShellExecute verwendet bis v 3.3.0.0 Standardmäßig die OPEN-Aktion. In der Beta ist das so verändert, dass die Standard-Aktion ausgeführt wird, wenn keine spezielle angegeben ist. Du musst also den Aktionsname in der Stable selbst aus der Registry auslesen oder die Beta verwenden ;)
    //Edit: Hab mal die Funktion dazu geschrieben, die das Verhalten der Beta nachbildet:

    [autoit]


    Func _GetAction($FileName)
    ; Prog@ndy
    Local $Extension = StringRegExpReplace($FileName, "\A.*(\.[^\/\\\.]+)\Z", "$1")
    If $Extension = "" Then Return SetError(2,0,"")
    Local $FileType = RegRead("HKCR\" & $Extension, "")
    If $FileType = "" Then Return SetError(3,0,"")
    Local $Action = RegRead("HKCR\" & $FileType & "\Shell", "")
    If $Action = "" Then
    If RegRead("HKCR\" & $FileType & "\Shell", "open") <> "" Then Return "open"
    $Action = RegEnumKey("HKCR\" & $FileType & "\Shell", 1)
    If $Action = "" Then Return SetError(3,0,0)
    EndIf
    Return $Action
    EndFunc

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

    $Dateiname = "test.mpg"
    ShellExecute($Dateiname, "", "", _GetAction($Dateiname))

    [/autoit]

    2 Mal editiert, zuletzt von progandy (25. Juni 2009 um 17:12)

  • Mit deiner Funktion gab es einen anderen Fehler, deshalb habe ich jetzt einfach die Beta genommen, danke!

    Einmal editiert, zuletzt von NoName (26. Juni 2009 um 12:48)