programm beenden

  • hallo

    ich habe ein Programm geschrieben was mehrere Prozesse nacheinander machen soll nun weis ich bei einer Sache nicht weiter und zwar lässt sich das eine Programm nicht wen es fertig ist automatisch beenden es kann nur den pc in den Ruhezustand versetzen, herunter fahren oder Alarmton auslösen meine Idee währe wenn der Alarmton ertönt einfach das Programm beenden lassen den Alarmton habe ich schon gefunden (windows-hinweis.wav) meine frage ist wie kann ich abfragen ob diese wav Datei gestartet ist oder könnte man diese wav Datei so umschreiben das sie das Programm schließt dank euch schon mal

  • Ich gehe mal davon aus dass du die *.wav Datei via SoundPlay() abspielst. Sieh dir mal den zweiten Parameter davon an.
    Zudem kannst du ein selbsgeschriebenes Programm beenden indem du den Exit Befehl nutzt.

    Falls dir das nicht weiterhilft:
    Mehr kann meine Kristallkugel leider nicht hergeben.
    Sinnvoll wäre der Sourcecode oder eine verkürzte Version welches dein Problem veranschaulicht.

  • hmm mal etwas genauer mein selbstgeschriebenes Programm soll mehrere Prozesse machen als erstes den Media Converter und danach noch andere Sachen soweit hab ich alles mache das alles über ShellExecuteWait weil das andere alles immer erst starten kann wenn das vorhergehende fertig ist nur dieser Media Converter beendet sich ja selbst nicht es gibt da halt nur die Möglichkeit das er wenn er fertig ist runterfährt, ruhemodus oder ein alarmton also macht mein Skript ja erst weiter wenn ich das Programm Schließe und dafür suche ich eine Möglichkeit das es von alleine geht also es geht um ein fremdprogramm was geschlossen werden muss nicht um eins was ich geschrieben habe

    Einmal editiert, zuletzt von theo (19. Februar 2014 um 17:19)

  • Du kannst eventuell mit

    [autoit]

    _WinAPI_FileInUse($sFile)

    [/autoit]

    prüfen ob die Sound Datei gerade verwendet wird. Jedoch kannst du so nicht überprüfen ob sie auch von dem zu schließenden Programm verwendet wird. Das Fremdprogramm kannst du dann mit

    [autoit]

    ProcessClose ( "process" )

    [/autoit]

    Beenden. So tolle Funktionen finden sich binnen Sekunden in der Hilfe 8)

  • sorry aber über _WinAPI_FileInUse ($sFile) finde ich nix hab auch lange nach vielen Möglichkeiten gesucht aber vielleicht nie die richtigen worte dafür gefunden Programm beenden ist kein ding das bekomm ich hin nur halt wie im ersten teil steht die abfrage finde ich nix

  • Zitat

    ShellExecuteWait weil das andere alles immer erst starten kann wenn das vorhergehende fertig


    das ginge wenn du eine Exe ausführst auch mit RunWait.

    Zitat

    sorry aber über _WinAPI_FileInUse ($sFile) finde ich nix


    Um _WinAPI_FileInUse benutzen zu können musst du die WinAPI inkludieren mit

    [autoit]

    #include <WinAPI.au3>

    [/autoit]


    Statt $sFile einfach den Dateipfad (der wav) angeben.
    Mehr Infos (englisch)

    Aber abgesehen davon beendet sich das Programm nicht nachdem es den Ton abgespielt hat?
    Oder ändert es z.B. seinen Fenstertitel? (den könnte man auch auslesen mit WinGetTitle)

  • so ich mach ma mein Skript rein

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    $dvd = "Y:\mkv\cdauswurf.exe"
    $coder = "C:\Program Files (x86)\ArcSoft\MediaConverter 8\MediaConverter.exe"
    ShellExecute ($dvd)
    ShellExecuteWait ($coder)
    FileMove("Y:\mkv\*.MP4","Y:\mkv\*.mp")
    FileMove("Y:\mkv\*.mp","Y:\mkv\*.mp4")
    RunWait(@ComSpec & ' /C Y:\mkv\rotate_admin.bat', "Y:\mkv")
    FileMove("Y:\mkv\*.mkv", "Z:" , 1)
    FileMove("Y:\mkv\*.mp4", "Z:" , 1)
    Runwait (@ComSpec & ' /C Y:\mkv\spiegeln.ffs_batch', "Y:\mkv")
    Shutdown(12)

    [/autoit]


    der mediaconverter hat jetzt stunden zu tun ich habe die Möglichkeit bei dem converter einzustellen (was er nach dem letzten film machen soll) ob er ein alarmton bringt, in den Ruhezustand fährt oder runter fährt also es bleibt auch an wenn der ton beendet ist ich schreibe mal dazu das ich eigentlich nicht viel Ahnung von programmieren habe und sicher das ein oder andere hätte anderst geschrieben werden können aber so hats funktioniert ;) nur das ich halt den converter manuell schliessen muss das möchte ich noch ändern

  • Gut ich möchte dein Script jetzt wirklich nicht kritisieren aber (so wie du dein Script jetzt geschrieben hast) sind alle Includes sinnlos und die Zeile 10 macht genau das rückgängig was auf Zeile 9 gemacht wird.

    Und wie gesagt du könntest das ganze mit _WinAPI_FileInUse lösen.
    Dazu musst du den Konverter aber so starten das nicht (direkt) auf das Beenden des Konverters gewartet wird.
    Also:

    [autoit]


    ShellExecute($coder)
    ;oder
    Run($coder) ;(wenn $coder wie in deinem Fall eine .exe ist)

    [/autoit]

    Dann musst du entweder _WinAPI_FileInUse in einer Schleife aufrufen und den Converter beenden (z.B. mit ProcessClose) wenn die Datei genutzt wird (bitte Hilfe zu do oder while und _WinAPI_FileInUse lesen).
    ODER
    du bekommst den Fenstertitel des Konverters heraus (Tipp: Au3Info) und schreibt den Scriptteil nach dem Starten dann etwa so:

    [autoit]


    WinWait($WindowTitle_normal) ;Hier den Fenstertitel beim Start vom Converter einfügen
    WinWait($WindowTitle_finish) ;Hier den Fenstertitel einfügen der angezeigt wird wenn der Converter fertig ist (ich denke doch das der Converter seinen Fenstertitel ändert)

    [/autoit]

    P.S: "cdauswurf" geht bei AutoIt auch mit CDTray

  • und die Zeile 10 macht genau das rückgängig was auf Zeile 9 gemacht wird.

    Nicht ganz. Er scheint hier die Schreibweise von "MP4" zu "mp4" ändern zu wollen. Dafür muss er den Zwischenschritt "mp" nehmen, weil ihm filemove() ansonsten vermutlich um die Ohren haut, dass die Ziel- und Quelldatei identisch ist, da Windows keinen Unterschied zwischen Groß- und Kleinschreibung macht.

  • also danke erst mal für die antworten das umschreiben der Endung muss so sein die Großbuchstaben werden später nicht erkannt es muss klein geschrieben sein und cdauswurf hab ich schon ;) deshalb startet da eine exe ich weis das hätte ich sicherlich auch mit in dieses script schreiben können was auch sicher noch kommt aber ich wollte es erst mal so zum laufen bringen und mich zum schluss um solche Feinheiten kümmern

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Laufwerke", 129, 328, 183, 295)
    GUISetBkColor(0x000000)
    $d = GUICtrlCreateButton("D", 16, 8, 65, 25, 0)
    GUICtrlSetBkColor(-1, 0xFF1E04)
    $alle = GUICtrlCreateButton("ALLE", 24, 280, 73, 25, 0)
    GUICtrlSetBkColor(-1, 0xFF1E04)
    $e = GUICtrlCreateButton("E", 16, 40, 65, 25, 0)
    GUICtrlSetBkColor(-1, 0xFF1E04)
    $f = GUICtrlCreateButton("F", 16, 72, 65, 25, 0)
    GUICtrlSetBkColor(-1, 0xFF1E04)
    $g = GUICtrlCreateButton("G", 16, 104, 65, 25, 0)
    GUICtrlSetBkColor(-1, 0xFF1E04)
    $h = GUICtrlCreateButton("H", 16, 136, 65, 25, 0)
    GUICtrlSetBkColor(-1, 0xFF1E04)
    $i = GUICtrlCreateButton("I", 16, 168, 65, 25, 0)
    GUICtrlSetBkColor(-1, 0xFF1E04)
    $j = GUICtrlCreateButton("J", 16, 200, 65, 25, 0)
    GUICtrlSetBkColor(-1, 0xFF1E04)
    $k = GUICtrlCreateButton("K", 16, 232, 65, 25, 0)
    GUICtrlSetBkColor(-1, 0xFF1E04)
    $is = GUICtrlCreateButton("I", 96, 32, 25, 49, 0)
    GUICtrlSetBkColor(-1, 0x80FF00)
    $js = GUICtrlCreateButton("J", 96, 120, 25, 49, 0)
    GUICtrlSetBkColor(-1, 0x80FF00)
    $ks = GUICtrlCreateButton("K", 96, 208, 25, 49, 0)
    GUICtrlSetBkColor(-1, 0x80FF00)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $d
    CDTray('D:', 'open')

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

    Case $e
    CDTray('E:', 'open')

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

    Case $f
    CDTray('F:', 'open')

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

    Case $g
    CDTray('G:', 'open')

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

    Case $h
    CDTray('H:', 'open')

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

    Case $i
    CDTray('I:', 'open')

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

    Case $j
    CDTray('J:', 'open')

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

    Case $k
    CDTray('K:', 'open')

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

    Case $alle
    CDTray('D:', 'open')
    CDTray('E:', 'open')
    CDTray('F:', 'open')
    CDTray('G:', 'open')
    CDTray('H:', 'open')
    CDTray('I:', 'open')
    CDTray('J:', 'open')
    CDTray('K:', 'open')

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

    Case $is
    CDTray('I:', 'close')

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

    Case $js
    CDTray('J:', 'close')

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

    Case $ks
    CDTray('K:', 'close')
    EndSwitch
    WEnd

    [/autoit]

    und das mit dem fenstertitel wird nicht gehen da ich keine Änderung sehe also wollte ich dann mal mit _WinAPI_FileInUse versuchen wenn ich hier wieder mehr zeit habe mache sowas nicht gern in stress


    PS: stören diese include wenn sie nicht benötigt werden ?? ich öffne immer mein testscript und schmeiss immer das andere raus statt ein neues scrip zu öffnen :S deshalb bleiben die immer drin

    2 Mal editiert, zuletzt von theo (26. Februar 2014 um 09:19)

  • so hab mal wieder etwas gesucht und auch was gefunden nur verstehe ich nicht warum es mal geht und mal nicht

    Spoiler anzeigen
    [autoit]

    run ("C:\Program Files\ArcSoft\MediaConverter 8\MediaConverter.exe")
    $fFile = "C:\Windows\Media\Windows-Hinweis.wav"
    While 1
    If _FileInUse($fFile) = 0 then
    Else
    ProcessClose( "MediaConverter.exe" )
    Exit
    EndIf
    WEnd

    ;===============================================================================
    ;
    ; Function Name: _FileInUse()
    ; Description: Checks if file is in use
    ; Parameter(s): $sFilename = File name
    ; Return Value(s): 1 - file in use (@error contains system error code)
    ; 0 - file not in use or file not exists
    ; Create by: Rogue5099
    ; Modified by: michaelslamet
    ;
    ;===============================================================================
    Func _FileInUse($sFilename)
    ;note: dword", 0x40000000, _ ---> jalan bagus jika $sFilename ada di hdd local, tapi jika $sFilename ada di network drive, gunakan dword", 0x80000000, _
    Local $aRet, $hFile
    If StringUpper(DriveGetType($sFilename)) = "NETWORK" Then
    $aRet = DllCall("Kernel32.dll", "hwnd", "CreateFile", _
    "str", $sFilename, _ ;lpFileName
    "dword", 0x80000000, _ ;dwDesiredAccess = GENERIC_READ
    "dword", 0x00000004, _ ;dwShareMode = DO NOT SHARE
    "dword", 0, _ ;lpSecurityAttributes = NULL
    "dword", 3, _ ;dwCreationDisposition = OPEN_EXISTING
    "dword", 128, _ ;dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL
    "hwnd", 0) ;hTemplateFile = NULL
    Else
    $aRet = DllCall("Kernel32.dll", "hwnd", "CreateFile", _
    "str", $sFilename, _ ;lpFileName
    "dword", 0x40000000, _ ;dwDesiredAccess = GENERIC_WRITE
    "dword", 0x00000004, _ ;dwShareMode = DO NOT SHARE
    "dword", 0, _ ;lpSecurityAttributes = NULL
    "dword", 3, _ ;dwCreationDisposition = OPEN_EXISTING
    "dword", 128, _ ;dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL
    "hwnd", 0) ;hTemplateFile = NULL
    EndIf
    If NOT FileExists($sFilename) Then
    Return 0
    Else
    $hFile = $aRet[0]
    If $hFile = -1 Then ;INVALID_HANDLE_VALUE = -1
    $aRet = DllCall("Kernel32.dll", "int", "GetLastError")
    SetError($aRet[0])
    Return 1
    Else
    ;close file handle
    DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
    Return 0
    EndIf
    EndIf
    EndFunc

    [/autoit]

    ab und zu kommt auch kein hinweiston nach dem ende des converters aber nur wenn es über das script läuft

  • Weil du da ja auch nirgendwo etwas abspielst.

    Wärst du bitte so nett und achtest etwas auf Gross- und Kleinschreibung und eine wenigstens ansatzweise existente Interpunktion. Deine Beiträge lassen sich wirklich sehr schwer leeen und vor allem verstehen.

    Foreneinträge sollen auch später noch Anderen helfen. Das könnte hier etwas schwierig werden.

    Danke!

  • der Mediaconverter kann nach beenden einen Warnhinweis ertönen lassen bei mir Windows-Hinweis.wav also der ton kommt von allein wenn der Converter fertig ist die file abfrage scheint soweit zu funktionieren wenn ich diese wav manuell starte nur nicht wenn der Converter versucht den ton zu spielen mal kommt ein ton mal nicht habe es sehr viele male getestet und auch wenn mal ein ton kommt funktioniert es nur sehr selten achso habe windows7 Prof 32 bit wenn das was zu sagen hat deshalb konnte ich es ja nicht über herunterfahren lösen habe gelesen das man unter win7 herunterfahren nicht mehr unterbrechen kann ist es nicht irgendwie möglich in eine wav Datei so ein Befehl wie ProcessClose einzufügen das währe doch das einfachste

  • Moin!

    Da ich mir das Programm aus Interesse ansehen wollte, hab ich mir mal die Demo installiert. Leider stürzt es beim Laden der Quelldatei immer ab, weshalb ich nicht viel zum Ablauf der Kodierung sagen kann.
    Mir ist allerdings aufgefallen, dass sich im Installationsverzeichnis eine kleine Datei namens "Converter.exe" befindet.
    Wenn du ganz viel Glück hast, startet das Hauptprogramm (MediaConverter.exe) dieses zweite Programm und beendet es auch wieder, wenn ein Film umgewandelt wurde.
    Überprüfe das einfach mal im Taskmanager. Falls dem so ist, kann dein Skript auf die Beendigung von "Converter.exe" reagieren...

    Des weiteren kannst du mal versuchen den vorher erwähnten Befehl "_WinAPI_FileInUse" auf die Zieldatei anzuwenden, also die Datei, die bei der Konvertierung erstellt wird. Wenn die Konvertierung beendet ist, sollte die Datei ja logischerweise nicht mehr "in use" sein...

    Sanfte Grüße :D

  • hallo Friesel gute Idee mit der Converter.exe so könnte ich die abfrage umschreiben sie läuft nur solange convertiert wird leider geht es nur nicht wenn du mehrere hintereinander machen willst :( die exe geht nach jeder Dateien die convertiert werden soll aus und bei der nächsten wieder an und

    Zitat

    "_WinAPI_FileInUse" auf die Zieldatei anzuwenden,

    geht ja auch nicht da der Name ja nie gleich bleibt

    • Offizieller Beitrag

    Kaufe dir mal einen Sack mit Großbuchstaben und Satzzeichen.
    Das Geschreibsel grenzt schon an Körperverletzung.
    Wenn man hier Hilfe haben möchte, kann man sich auch bein schreiben ein bisschen Mühe geben.
    Dies ist nicht das Kauderwelschforum von klein Timbuktu X(

  • sorry prof. Raupi wusste nicht das es hier um Grammatik und Rechtschreibung geht verstehe jetzt nur nicht warum ich jetzt soweit gekommen bin wenns keiner lesen und verstehen kann aber egal danke noch mal an Friesel dank dir hab ich ich jetzt diesen weg gewählt

    Spoiler anzeigen
    [autoit]

    $input = InputBox("Beenden","Bezeichnung letzter Film:","","",400,150,50,50)
    $fFile = "Y:\mkv" & $input & ".MP4"
    While 1
    If _FileInUse($fFile) = 1 then
    While 2
    If _FileInUse($fFile) = 0 then
    sleep (6000)
    ProcessClose( "MediaConverter.exe" )
    Exit
    EndIf
    WEnd
    EndIf
    WEnd

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

    ;===============================================================================
    ;
    ; Function Name: _FileInUse()
    ; Description: Checks if file is in use
    ; Parameter(s): $sFilename = File name
    ; Return Value(s): 1 - file in use (@error contains system error code)
    ; 0 - file not in use or file not exists
    ; Create by: Rogue5099
    ; Modified by: michaelslamet
    ;
    ;===============================================================================
    Func _FileInUse($sFilename)
    ;note: dword", 0x40000000, _ ---> jalan bagus jika $sFilename ada di hdd local, tapi jika $sFilename ada di network drive, gunakan dword", 0x80000000, _
    Local $aRet, $hFile
    If StringUpper(DriveGetType($sFilename)) = "NETWORK" Then
    $aRet = DllCall("Kernel32.dll", "hwnd", "CreateFile", _
    "str", $sFilename, _ ;lpFileName
    "dword", 0x80000000, _ ;dwDesiredAccess = GENERIC_READ
    "dword", 0x00000004, _ ;dwShareMode = DO NOT SHARE
    "dword", 0, _ ;lpSecurityAttributes = NULL
    "dword", 3, _ ;dwCreationDisposition = OPEN_EXISTING
    "dword", 128, _ ;dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL
    "hwnd", 0) ;hTemplateFile = NULL
    Else
    $aRet = DllCall("Kernel32.dll", "hwnd", "CreateFile", _
    "str", $sFilename, _ ;lpFileName
    "dword", 0x40000000, _ ;dwDesiredAccess = GENERIC_WRITE
    "dword", 0x00000004, _ ;dwShareMode = DO NOT SHARE
    "dword", 0, _ ;lpSecurityAttributes = NULL
    "dword", 3, _ ;dwCreationDisposition = OPEN_EXISTING
    "dword", 128, _ ;dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL
    "hwnd", 0) ;hTemplateFile = NULL
    EndIf
    If NOT FileExists($sFilename) Then
    Return 0
    Else
    $hFile = $aRet[0]
    If $hFile = -1 Then ;INVALID_HANDLE_VALUE = -1
    $aRet = DllCall("Kernel32.dll", "int", "GetLastError")
    SetError($aRet[0])
    Return 1
    Else
    ;close file handle
    DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
    Return 0
    EndIf
    EndIf
    EndFunc

    [/autoit]

    habe es einige male getestet scheint zu funktionieren

    • Offizieller Beitrag

    Es geht hier nicht um Grammatik, aber ein Spaghettisatz ist beschissen zu lesen und fehlende Interpunktion erleichtert bestimmt nicht das lesen.
    Aber alleine durch dein Prof. Raupi geschreibsel, wird mir klar, das es dir am Arsch vorbeigeht etwas zu ändern.
    Es wird immer einen Dummen geben, der solchen Sonderschulniveau Posts antwortet.
    Die Gutmütigkeit der anderen ist halt grenzenlos. Warum soll man sich auch anstrengen, Posts leserlich zu schreiben?
    Nur keine Arbeit machen, schön im alten Schema weiter... wie die Lemminge....

  • wusste nicht das es hier um Grammatik und Rechtschreibung geht


    Geht es auch nicht. Hat niemand behauptet.

    verstehe jetzt nur nicht warum ich jetzt soweit gekommen bin wenns keiner lesen und verstehen kann


    Das verstehe ich allerdings auch nicht.