Laufwerke sperren

  • Da ja im Moment hier die Minimalistik vorherrscht, mein Beispielskript dazu.
    Erzeugt 52 checkboxes(2 x A-Z) und ein paar Buttons.
    Erzeugt Binärwerte aus der Registry und übersetzt sie in Dezimalwerte.
    (AutoIT3 kann das von Natur aus ja nicht so gut)
    Nix Externes. Dadurch bleibt das kompilierte Programm auch viel kleiner. ;)
    Hat jemand eine Idee, den Code weiter zu kürzen?
    97 Zeilen ist aber schon gut, oder?

    Spoiler anzeigen
    [autoit]

    Global $ix1[26],$ix2[26],$reg="HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer",$w=40,$h=20,$chbx[26]=["a:","b:","c:","d:","e:","f:","g:","h:","i:","j:","k:","l:","m:","n:","o:","p:","q:","r:","s:","t:","u:","v:","w:","x:","y:","z:" ]
    GUICreate("Laufwerke",250,350)
    chkbx1(10,10,0,12) ; erzeuge 13 checkboxes
    chkbx1(60,10,13,25) ; erzeuge weitere 13 checkboxes
    chkbx2(160,10,0,12) ; erzeuge 13 checkboxes
    chkbx2(200,10,13,25) ; erzeuge weitere 13 checkboxes
    $OK=GUICtrlCreateButton("OK",10,300,90,30)
    $Ab=GUICtrlCreateButton("Beenden",150,300,90,30)
    GUICtrlCreateLabel ("Ausblenden",10,280,80,20 )
    GUICtrlCreateLabel ("Sperren",150,280,80,20 )
    $lwhid=RegRead($reg,"NoDrives")
    get($lwhid,$ix1) ;lese versteckte Lw aus der Registry
    $lwres=RegRead($reg,"NoViewOnDrive")
    get($lwres,$ix2) ;lese verbotene Lw aus der Registry
    GUISetState()
    While 1
    $msg=GUIGetMsg()
    If $msg=$OK Then
    RegWrite($reg,"NoDrives","REG_DWORD",Read($ix1))
    RegWrite($reg,"NoViewOnDrive","REG_DWORD",Read($ix2))
    EndIf
    If $msg=$Ab Then ExitLoop
    WEnd
    Func get($lw,$ix)
    If $lw>0 Then
    $b=''
    While $lw > 0
    $b=String(Mod($lw,2))&$b
    $lw=Int($lw/2)
    WEnd
    $lw=StringSplit($b,"")
    $_max=$lw[0] - 1
    _AD($lw,0)
    _AR($lw)
    For $y=0 To $_max
    If $lw[$y]=1 Then GUICtrlSetState($ix[$y],1)
    Next
    Else
    EndIf
    Endfunc
    Func chkbx2($l,$t,$1,$2)
    For $c=$1 To $2
    $ix2[$c]=GUICtrlCreateCheckbox($chbx[$c],$l,$t,$w,$h)
    $t=$t+20
    Next
    EndFunc
    Func chkbx1($l,$t,$1,$2)
    For $c=$1 To $2
    $ix1[$c]=GUICtrlCreateCheckbox($chbx[$c],$l,$t,$w,$h)
    $t=$t+20
    Next
    EndFunc
    Func Read($idx)
    $h=""
    For $y=25 To 0 Step -1
    If GUICtrlRead($idx[$y])=1 Then
    $h=$h&1
    Else
    $h=$h&0
    EndIf
    Next
    $d=0
    For $i=0 To StringLen($h) Step 1
    $d=$d+Number(StringMid($h,StringLen($h)-$i,1))*(2^$i)
    Next
    Return $d
    EndFunc
    Func _AD(ByRef $ar, $ie)
    Local $iC = 0, $iU = 0
    $iU = UBound($ar)
    Local $arn[$iU - 1]
    If $ie < 0 Then $ie = 0
    If $ie > ($iU - 1) Then $ie = ($iU - 1)
    If $ie > 0 Then
    For $iC = 0 To $ie - 1
    $arn[$iC] = $ar[$iC]
    Next
    EndIf
    If $ie < ($iU - 1) Then
    For $iC = ($ie + 1) To ($iU - 1)
    $arn[$iC - 1] = $ar[$iC]
    Next
    EndIf
    $ar = $arn
    Return 1
    EndFunc
    Func _AR(ByRef $ar, $iB = 0, $iU = 0)
    Local $tp, $lt = UBound($ar) - 1
    If $iU < 1 Or $iU > $lt Then $iU = $lt
    For $i = $iB To $iB + Int(($iU - $iB - 1) / 2)
    $tp = $ar[$i]
    $ar[$i] = $ar[$iU]
    $ar[$iU] = $tp
    $iU = $iU - 1
    Next
    Return 1
    EndFunc
    ;Copyright Westi

    [/autoit]

    Zur Vunkzion:
    Ferschtekt(Ausblenden) oder ferbeatet(Sperren) den Zugriff auf Laufwerke.
    Ich habe es nicht besonders lesbar gemacht, aber für die Experten sollte es verständlich sein.
    Es ist halt minimalistisch...

    Gruß
    Westi

  • Sry aber - meines Wissens bist du Deutscher.
    Wenn du kein Deutscher / Österreicher / schweizer bist, sry.
    Wenn du Legastheniker bist, auch sry.


    Sorry, aber diese Rechtschreibung ist nicht so ganz das Wahre 8o
    So auf die schnelle seh ich:


    Vunkzion: richtig:Funktion
    Ferschtekt: richtig: Versteckt
    Ferbeatet : richtig: Verbietet.

  • Mahlzeit,

    ich war mal so frei und habe die "doppelte" Funktion 'chkbx2' rausgeworfen. Immerhin weitere 2 Zeilen weniger Code. Trozdem bitte mal testen ;)

    Spoiler anzeigen
    [autoit]


    Global $ix1[26],$ix2[26],$reg="HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer",$w=40,$h=20,$chbx[26]=["a:","b:","c:","d:","e:","f:","g:","h:","i:","j:","k:","l:","m:","n:","o:","p:","q:","r:","s:","t:","u:","v:","w:","x:","y:","z:" ]
    GUICreate("Laufwerke",250,350)
    chkbx1(10,10,0,12,1) ; erzeuge 13 checkboxes
    chkbx1(60,10,13,25,1) ; erzeuge weitere 13 checkboxes
    chkbx1(160,10,0,12,2) ; erzeuge 13 checkboxes
    chkbx1(200,10,13,25,2) ; erzeuge weitere 13 checkboxes
    $OK=GUICtrlCreateButton("OK",10,300,90,30)
    $Ab=GUICtrlCreateButton("Beenden",150,300,90,30)
    GUICtrlCreateLabel ("Ausblenden",10,280,80,20 )
    GUICtrlCreateLabel ("Sperren",150,280,80,20 )
    $lwhid=RegRead($reg,"NoDrives")
    get($lwhid,$ix1) ;lese versteckte Lw aus der Registry
    $lwres=RegRead($reg,"NoViewOnDrive")
    get($lwres,$ix2) ;lese verbotene Lw aus der Registry
    GUISetState()
    While 1
    $msg=GUIGetMsg()
    If $msg=$OK Then
    RegWrite($reg,"NoDrives","REG_DWORD",Read($ix1))
    RegWrite($reg,"NoViewOnDrive","REG_DWORD",Read($ix2))
    EndIf
    If $msg=$Ab Then ExitLoop
    WEnd
    Func get($lw,$ix)
    If $lw>0 Then
    $b=''
    While $lw > 0
    $b=String(Mod($lw,2))&$b
    $lw=Int($lw/2)
    WEnd
    $lw=StringSplit($b,"")
    $_max=$lw[0] - 1
    _AD($lw,0)
    _AR($lw)
    For $y=0 To $_max
    If $lw[$y]=1 Then GUICtrlSetState($ix[$y],1)
    Next
    Else
    EndIf
    Endfunc
    Func chkbx1($l,$t,$1,$2,$xx)
    For $c=$1 To $2
    If $xx = 1 Then
    $ix1[$c]=GUICtrlCreateCheckbox($chbx[$c],$l,$t,$w,$h)
    Elseif $xx = 2 Then
    $ix2[$c]=GUICtrlCreateCheckbox($chbx[$c],$l,$t,$w,$h)
    EndIf
    $t=$t+20
    Next
    EndFunc
    Func Read($idx)
    $h=""
    For $y=25 To 0 Step -1
    If GUICtrlRead($idx[$y])=1 Then
    $h=$h&1
    Else
    $h=$h&0
    EndIf
    Next
    $d=0
    For $i=0 To StringLen($h) Step 1
    $d=$d+Number(StringMid($h,StringLen($h)-$i,1))*(2^$i)
    Next
    Return $d
    EndFunc
    Func _AD(ByRef $ar, $ie)
    Local $iC = 0, $iU = 0
    $iU = UBound($ar)
    Local $arn[$iU - 1]
    If $ie < 0 Then $ie = 0
    If $ie > ($iU - 1) Then $ie = ($iU - 1)
    If $ie > 0 Then
    For $iC = 0 To $ie - 1
    $arn[$iC] = $ar[$iC]
    Next
    EndIf
    If $ie < ($iU - 1) Then
    For $iC = ($ie + 1) To ($iU - 1)
    $arn[$iC - 1] = $ar[$iC]
    Next
    EndIf
    $ar = $arn
    Return 1
    EndFunc
    Func _AR(ByRef $ar, $iB = 0, $iU = 0)
    Local $tp, $lt = UBound($ar) - 1
    If $iU < 1 Or $iU > $lt Then $iU = $lt
    For $i = $iB To $iB + Int(($iU - $iB - 1) / 2)
    $tp = $ar[$i]
    $ar[$i] = $ar[$iU]
    $ar[$iU] = $tp
    $iU = $iU - 1
    Next
    Return 1
    EndFunc
    ;Copyright Westi

    [/autoit]

    Gruß Trallala

    Einmal editiert, zuletzt von trallala (25. November 2007 um 13:12)

  • Zitat

    Original von trallala
    Mahlzeit,

    ich war mal so frei und habe die "doppelte" Funktion 'chkbx2' rausgeworfen. Immerhin weitere 2 Zeilen weniger Code. Trozdem bitte mal testen ;)

    Gruß Trallala

    Klappt aber nicht, weil dann die zweite Gruppe Checkboxen die selbe ID bekommen, wie die erste.

    Gruß
    Westi

    @huggy
    Du bist aber 'ne Spassbremse ;)

    2 Mal editiert, zuletzt von Westi (25. November 2007 um 16:23)