Problem bei erneutem Schließen eines GUIs

  • Hallo alle zusammen.

    Ich hab ein "Sicherheits-Tool" für z.B. LAN-Partys geschrieben, dass den PC sperrt wenn man den USB-Stick oder MP3Player aus der USB schnittstelle zieht.
    Soweit so gut. Nun zu meinem Problem: Wenn ich das 1. Mal meinen Stick ziehe wird gesperrt, wenn ich ihn dann wieder reinstecke, wird der GUI wieder geschlossen. Wenn ich ihn aber nun des 2. mal rausziehe gibts einen Fehler.... . Ich kenne eigentlich jeden Fehlertyp der mir bisher untergekommen ist aber den hab ich noch nie gesehn:

    Fehler

    C:\Programme\AutoIt3\Include\WindowsConstants.au3 (11) : ==> Can not redeclare a constant.:
    Global Const $WS_TILED = 0
    Global Const ^ ERROR

    Script
    [autoit]

    Local $Seriennummer
    Local $Laufwerk = "E:\"

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

    HotKeySet("!e","_Delete")

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

    _Go()
    Func _Go()
    $Seriennummer = _Seriennummer()
    Do
    $Rueckgabe1 = DriveGetFileSystem($Laufwerk)
    If Not $Rueckgabe1 = "FAT" Then _Sperre()
    Until ""
    EndFunc
    Func _Seriennummer()
    $Seriennummer = DriveGetSerial($Laufwerk)
    Return $Seriennummer
    EndFunc

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

    Func _Sperre()

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

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>

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

    $Form1 = GUICreate("Gesperrt",@DesktopWidth,@DesktopHeight, 0,0, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST))

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

    GUISetState(@SW_SHOW)
    GUISetState(@SW_Lock)
    WinSetTrans($Form1,"",1)

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

    While 1
    Sleep(20)
    $Rueckgabe = DriveGetFileSystem ($Laufwerk)
    ;~ If WinExists("Windows Task-Manager") Or ProcessExists("taskmgr.exe") Then WinKill("Windows Task-Manager")
    ;~ BlockInput(1)
    If $Rueckgabe = "FAT" Then
    $Seriennummer2 = DriveGetSerial($Laufwerk)

    If $Seriennummer = $Seriennummer2 Then
    GUIDelete($Form1)
    ;~ BlockInput(0)
    _Go()
    EndIf
    EndIf
    WEnd

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

    EndFunc

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

    Func _Delete()
    GUIDelete()
    Exit
    EndFunc

    [/autoit]

    Das Script ist nochnet fertig, aber ich würde gerne die "Roh" Version schonmal zum laufen bringen.

    Hoffe auf Hilfe
    LG
    Noobyn00b

    PS: Zum testen hab ich mal das Blockinput und die Zeile mitm Winkill für den Task-Man. rausgenommen.

    Beendet wird mit alt + e (Zu testzwecken)

    • Offizieller Beitrag

    Versuch mal die Abfrage ob der Stick eine FAT32 hat .
    Wenn ich dein Script wie folgt ändere

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    Local $Seriennummer
    Local $Laufwerk = "d:\"

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

    HotKeySet("!e","_Delete")

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

    _Go()
    Func _Go()
    $Seriennummer = _Seriennummer()
    Do
    $Rueckgabe1 = DriveGetFileSystem($Laufwerk)
    If Not $Rueckgabe1 = "FAT32" Then _Sperre()
    Until ""
    EndFunc
    Func _Seriennummer()
    $Seriennummer = DriveGetSerial($Laufwerk)
    Return $Seriennummer
    EndFunc

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

    Func _Sperre()
    $Form1 = GUICreate("Gesperrt",@DesktopWidth,@DesktopHeight, 0,0, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST))

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

    GUISetState(@SW_SHOW)
    GUISetState(@SW_Lock)
    WinSetTrans($Form1,"",1)

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

    While 1
    Sleep(20)
    $Rueckgabe = DriveGetFileSystem ($Laufwerk)
    ;~ If WinExists("Windows Task-Manager") Or ProcessExists("taskmgr.exe") Then WinKill("Windows Task-Manager")
    ;~ BlockInput(1)
    If $Rueckgabe = "FAT32" Then
    $Seriennummer2 = DriveGetSerial($Laufwerk)

    If $Seriennummer = $Seriennummer2 Then
    GUIDelete($Form1)
    ;~ BlockInput(0)
    _Go()
    EndIf
    EndIf
    WEnd

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

    EndFunc

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

    Func _Delete()
    GUIDelete()
    Exit
    EndFunc

    [/autoit]

    dann funzt es .
    Edit doch nicht hat 1 mal gefunzt dann gleiche Fehlermeldung .
    Edit 2 : Der Fehler in deinem Script ist du solltest deine Includierung am anfang des Scriptes machen . Immer wenn du Sperren aufrufst includierst du neu . Oberer Script angepasst und läuft bei mir .

  • hm, wenn ich ihn nun rausziehe kommt der GUI, wenn ich ihn aber wieder reinstecke geht dieser nicht weg O.o

    Script
    [autoit]

    Local $Seriennummer
    Local $Laufwerk = "E:\"

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

    HotKeySet("!e","_Delete")

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

    _Go()
    Func _Go()
    $Seriennummer = _Seriennummer()
    Do
    $Rueckgabe1 = DriveGetFileSystem($Laufwerk)
    If Not $Rueckgabe1 = "FAT32" Then _Sperre()
    Until ""
    EndFunc
    Func _Seriennummer()
    $Seriennummer = DriveGetSerial($Laufwerk)
    Return $Seriennummer
    EndFunc

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

    Func _Sperre()

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

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>

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

    $Form1 = GUICreate("Gesperrt",@DesktopWidth,@DesktopHeight, 0,0, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST))

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

    GUISetState(@SW_SHOW)
    GUISetState(@SW_Lock)
    WinSetTrans($Form1,"",1)

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

    While 1
    Sleep(20)
    $Rueckgabe = DriveGetFileSystem ($Laufwerk)
    ;~ If WinExists("Windows Task-Manager") Or ProcessExists("taskmgr.exe") Then WinKill("Windows Task-Manager")
    ;~ BlockInput(1)
    If $Rueckgabe = "FAT32" Then

    $Seriennummer2 = DriveGetSerial($Laufwerk)

    If $Seriennummer = $Seriennummer2 Then
    GUIDelete($Form1)
    ;~ BlockInput(0)
    _Go()
    EndIf
    EndIf
    WEnd

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

    EndFunc

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

    Func _Delete()
    GUIDelete()
    Exit
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Dein Script funzt bei mir siehe Edit meines letzten Postes. Hab FAT32 als Dateisystem eingesetzt weil mein USb-Stick auf FAT32 läuft. Wenn die Includes am anfang des Scriptes eingefügt werden kommt auch der Fehler nicht mehr .

  • hm, ich habe grade rausgefunden dass mein Stick unter "Garnix" läuft dh dass er garnet einen dieser typen hat. Daraus folgt dass ich die "ob er da ist" Abfrage etz über die Seriennummer mache weils dann auch mit anderen Geräten keinen Fehler gibt . Ich edit dann des Script hier rein...

    EDIT: Hier das Script. Habe es nun mit der Seriennummer gelöst da mann dann größeren Spielraum mit dem verwendebaren Geräten hat.
    Durch den Include oben ist auch der andere Fehler verschwunden. Hier das Script zum Testen (Blockinput und Winkill bei Task-Man aus sowie eine Not-Delete-Funktion über alt + e eingebaut )

    Testscript
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    Local $Seriennummer, $Seriennummer2
    Local $Laufwerk = "E:\"
    HotKeySet("!e","_Delete")

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

    _Go()
    Func _Go()
    $Seriennummer = _Seriennummer()

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

    Do
    $Seriennummer2 = DriveGetSerial($Laufwerk)
    If Not $Seriennummer2 = $Seriennummer Then _Sperre()

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

    Until ""
    EndFunc
    Func _Seriennummer()
    $Seriennummer = DriveGetSerial($Laufwerk)
    Return $Seriennummer
    EndFunc

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

    Func _Sperre()

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

    $Form1 = GUICreate("Gesperrt",@DesktopWidth,@DesktopHeight, 0,0, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST))

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

    GUISetState(@SW_SHOW)
    GUISetState(@SW_Lock)
    WinSetTrans($Form1,"",1)

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

    While 1
    Sleep(20)
    $Seriennummer2 = DriveGetSerial($Laufwerk)
    ;~ If WinExists("Windows Task-Manager") Or ProcessExists("taskmgr.exe") Then WinKill("Windows Task-Manager")
    ;~ BlockInput(1)
    If $Seriennummer2 = $Seriennummer Then
    GUIDelete($Form1)
    ;~ BlockInput(0)
    _Go()
    EndIf
    WEnd

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

    EndFunc

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

    Func _Delete()
    GUIDelete()
    Exit
    EndFunc

    [/autoit]

    Das fertige, mit behobenen Schönheitsfehlern, werde ich dann nochmal bei den Skripten posten, freue mich aber jetzt schon über kritik oder Verbesserungsvorschläge.

    2 Mal editiert, zuletzt von Noobyn00b (22. Oktober 2008 um 19:33)

    • Offizieller Beitrag

    DEs Script funzt gar net bei mir . Meine Version wäre diese :

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    Global $Seriennummer, $Seriennummer2,$Rueckgabe
    Global $Laufwerk = "d:\"

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

    HotKeySet("!e","_Delete")

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

    _Go()
    Func _Go()
    $Seriennummer = _Seriennummer()
    Do
    $Rueckgabe = DriveGetSerial($Laufwerk)
    if $Rueckgabe = "" then _Sperre()
    sleep(100)
    Until ""
    EndFunc
    Func _Seriennummer()
    $Seriennummer = DriveGetSerial($Laufwerk)
    Return $Seriennummer
    EndFunc

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

    Func _Sperre()
    Global $Form1 = GUICreate("Gesperrt",@DesktopWidth,@DesktopHeight, 0,0, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW,$WS_EX_TOPMOST))
    GUISetState(@SW_SHOW)
    GUISetState(@SW_Lock)
    WinSetTrans($Form1,"",1)
    While 1
    Sleep(20)
    ;~ If WinExists("Windows Task-Manager") Or ProcessExists("taskmgr.exe") Then WinKill("Windows Task-Manager")
    ;~ BlockInput(1)
    $Seriennummer2 = DriveGetSerial($Laufwerk)

    If $Seriennummer = $Seriennummer2 Then
    GUIDelete($Form1)
    ;~ BlockInput(0)
    _Go()
    EndIf
    WEnd
    EndFunc

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

    Func _Delete()
    GUIDelete()
    Exit
    EndFunc

    [/autoit]

    Die funzt bei mir einfach nur D:\ IN E:\ tauschen
    Edit deine Version funzt auch hab vergessen des e:\ in d:\ umzuändern .

    • Offizieller Beitrag

    Schau mal in der Hilfe unterdrivegetdrive nach.

  • prüfe in einer Schleife (aller USB Geräte) die Seriennummer und wenn eine past gut wenn nicht auch gut, hier etwas modifizerte Hilfe ;)


    [autoit]

    $serial="fhshhfsshk4h4kjh4kj"
    $var = DriveGetDrive( "REMOVABLE" ) ;evtl ["ALL"]
    If NOT @error Then
    ; MsgBox(4096,"", "Found " & $var[0] & " drives")
    For $i = 1 to $var[0]
    If DriveGetSerial($var[$i])=$serial Then $loaldrive=$var[$i]

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

    Next
    EndIf

    [/autoit]

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

    4 Mal editiert, zuletzt von Dietmar (24. Oktober 2008 um 23:32)

  • Ich verstehe zwar nur die Hälfte aber wie soll ichs besser machen? Ich könnte ein paar Funcs einsparen... aber ich brauch ja die _Go (Warte auf Trennung-Funktion) und die _Sperre Funktion als GO-to Befhel oder?
    Und heißt des oben dasss das Script wenn man es Ausführt nur 5100 mal die Funktionen aufrufen kann? ^^ das würde mir glaube ich reichen xD

    EDIT: Ich baus etz mal n bissl um