Autostart nach schließen des Laufwerks

  • Hallo Zusammen,

    vielleicht kann mir hier jemand weiterhelfen bin verzweifelt auf der Suche nach einer kleiner Fuznktion. Habe mir ein Skript erstellt welches wie folgt prüft ob eine CD / DVD eingelegt wurde und wenn ja dann ein weiteres Skript ausführt. Soweit funktioniert das auch ganz gut.

    Spoiler anzeigen


    while 1
    $status=DriveStatus("E:\")
    if $status="READY" and $statusfirst="NOTREADY" then
    Run("C:\start.exe")
    EndIf
    $statusfirst=$status
    sleep(500)
    wend


    Das Problem ist nun dass aber ständig Zugriffe auf das Laufwerk erfolgen und es manchmal passiert dass der PC einfach kurz hängen bleibt weil die CD wieder neu eingelesen werden muss. Das nervt einfach. Was ich nun suche wäre also eine interligente Prüfung ob eine CD eingelegt wurde und wenn ja dann (je nach Inhalt) ein Abspielen eines Skriptes. Ich habe schon daran gedacht ob man vielleicht den Status Schublade auf oder zu prüfen kann. Irgendwie müssen das die Windows internen Programme doch auch machen oder? Da passiert das nämlich nicht.

    Danke und Grüße

    Alex

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    main()

    Func OnAutoItStart()
    Opt("MustDeclareVars", 1)
    EndFunc ;==>OnAutoItStart

    Func main()
    Local Const $S_CD = "D:"
    Local $as_cdc = ""
    _CDChanged($S_CD, $as_cdc)

    While 1
    _CDChanged($S_CD, $as_cdc)
    Switch $as_cdc[0]
    Case 1
    ConsoleWrite($S_CD & " (Tray closed)" & @CR)
    Case 2
    ConsoleWrite($S_CD & " (Tray opened)" & @CR)
    Case 3
    ConsoleWrite($S_CD & " (Label changed)" & @CR)
    EndSwitch
    Sleep(500)
    WEnd
    EndFunc ;==>main

    Func _CDChanged(Const $S_PATH, ByRef $as_cdc)
    If IsArray($as_cdc) Then
    ReDim $as_cdc[3]
    $as_cdc[0] = 0

    Local $s_tmp = DriveGetLabel($S_PATH)
    If $s_tmp <> $as_cdc[1] Then
    $as_cdc[0] = 3
    $as_cdc[1] = $s_tmp
    EndIf

    $s_tmp = DriveStatus($S_PATH)
    If $s_tmp <> $as_cdc[2] Then
    If $s_tmp = "READY" Then $as_cdc[0] = 1
    If $s_tmp = "NOTREADY" Then $as_cdc[0] = 2
    $as_cdc[2] = $s_tmp
    EndIf
    Else
    Dim $as_cdc[3] = [0, DriveGetLabel($S_PATH), DriveStatus($S_PATH) ]
    EndIf
    EndFunc ;==>_CDChanged

    [/autoit]
    Spoiler anzeigen
    [autoit]

    ; CD-ROM Status
    #cs
    Einlesen von Label und Status
    wenn Status oder Label sich geändert haben, dann Meldung
    #ce

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

    _checkCD('D:\', True)

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

    While 1
    Sleep(1000)
    If _checkCD('D:\') Then
    Switch _checkCD('D:\')
    Case 1
    ConsoleWrite("Info : opened!" & @CRLF)
    Case 2
    ConsoleWrite("Info : closed!" & @CRLF)
    Case 3
    ConsoleWrite("Info : CD gewechselt!" & @CRLF)
    EndSwitch
    _checkCD('D:\', True)
    EndIf
    WEnd

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

    Func _checkCD($drive, $start = False)
    If $start Then
    Global $drive_label = DriveGetLabel($drive)
    Global $drive_status = DriveStatus($drive)
    Else
    If $drive_status <> DriveStatus($drive) And $drive_status = 'READY' Then Return 1
    If $drive_status <> DriveStatus($drive) And $drive_status = 'NOTREADY' Then Return 2
    If $drive_label <> DriveGetLabel($drive) Then Return 3
    EndIf
    Return 0
    EndFunc ;==>_checkCD

    [/autoit]
  • Hallo,

    vielen lieben Dank für die schnelle Antwort. Habe es schon eingebaut und funktioniert auch soweit. Allerdings passieren auch hier vermehr Zugriffe auf das Laufwerk obwohl ich keine neue CD einlege. Leider wird dadurch öfters mal das System für einige Sekungen blockiert.

    Gibt es hier einen Trick um das etwas interligenter abzufragen? ODer habe ich etwas falsch gemacht?

    Danke und Grüße

    Alex