Desktopsperre - USB-Stick zum ent-/sperren des Desktop

    • Offizieller Beitrag

    Ich habe meine Desktopsperre mal etwas erweitert/verbessert.
    Diese Version hier fragt nicht ständig den USB-Stick ab, sondern wartet auf eine Windowsmessage beim an-/abstecken des Sticks. Außerdem wird beim ersten Start die ID eines USB-Stick "registriert" und in einer Inidatei abgespeichert. Mit diesem registrierten Stick kann man dann den Desktop sperren/entsperren.
    Zum beenden des Scripts dient die Tastenkombination [ALT] + [ESC].

    Spoiler anzeigen
    [autoit]


    #include<MenuConstants.au3>
    #include<SendMessage.au3>
    #include<WindowsConstants.au3>
    #include<Misc.au3>

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

    Opt('GUICloseOnESC', 0)
    Opt('TrayIconHide', 1)
    Opt('TrayAutoPause', 0)
    Opt('WinTitleMatchMode', 4)

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

    Global $gui_titel = 'Desktopsperre'
    Global $sIni = @ScriptDir & '\Desktopsperre.ini'
    Global Const $WM_DEVICECHANGE = 0x0219
    Global Const $Off = 2, $On = -1
    Global $hMonitor = WinGetHandle('classname=Progman')
    Global $bLock = False, $bOnOff = False
    Global $usbstor = 'HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\usbstor\Enum'
    Global $r = RegRead($usbstor, 'count')
    If @error Then
    MsgBox(48, 'Desktopsperre', 'Konnte Registryeintrag nicht lesen!' & $r)
    Exit
    EndIf
    Global $sID = IniRead($sIni, 'ID', '1', '')
    If $sID = '' Then _RegID()

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

    Global $gui = GUICreate($gui_titel)

    GUIRegisterMsg($WM_DEVICECHANGE, 'MY_WM_DEVICECHANGE')

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

    While 1
    sleep(10)
    If $bLock() Then
    _ToggleMonitor($hMonitor, $Off)
    _MouseTrap(@DesktopWidth - 1, @DesktopHeight - 1, @DesktopWidth - 1, @DesktopHeight - 1); Maus in die untere, rechte Ecke setzen (einfrieren)
    HotKeySet('!{Esc}'); Hotkey freigeben, damit das Programm nicht beendet werden kann
    If WinExists('Windows Task-Manager') Then WinClose('Windows Task-Manager'); evtl. geöffneten Task-Manager schliessen
    BlockInput(1)
    Else
    _ToggleMonitor($hMonitor, $On)
    _MouseTrap(); Maus wieder freigeben
    BlockInput(0)
    HotKeySet('!{Esc}', '_End'); Hotkey (ALT+{Esc}) zum beenden des Programms einrichten
    EndIf
    Wend; Schleife fortsetzen

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

    Func MY_WM_DEVICECHANGE($hWnd, $Msg, $wParam, $lParam)
    If _Unlock() Then; wenn die Funktion '1' zurückliefert (USB-Stick gesteckt), dann
    $bLock = False
    Else; wenn die Funktion '0' zurückliefert (USB-Stick abgezogen), dann
    $bLock = True
    EndIf
    EndFunc

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

    Func _Unlock()
    For $count = 0 To RegRead($usbstor, 'count') - 1; Schleife für alle USB-Wechseldatenträger
    If $sID = RegRead($usbstor, $count) Then Return 1; Stimmt die id mit der id eines gemounteten USB-Sticks überein, dann Funktion beenden
    Next
    Return 0; keine Übereinstimmung gefunden, dann '0' zurückgeben
    EndFunc

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

    Func _RegID()
    MsgBox(0, $gui_titel, 'Falls der USB-Stick momentan eingesteckt ist,' & @CRLF & 'bitte entfernen und dann auf [Ok] klicken!')
    $count = RegRead($usbstor, 'count')
    MsgBox(0, $gui_titel, 'Bitte jetzt den USB-Stick einstecken!' & @CRLF & 'Er wird automatisch erkannt.', 5)
    While RegRead($usbstor, 'count') = $count
    Sleep(100)
    WEnd
    $count = RegRead($usbstor, 'count')
    $sID = RegRead($usbstor, $count - 1)
    IniWrite($sIni, 'ID', '1', $sID)
    MsgBox(0, $gui_titel, 'Dieser USB-Stick ist nun zum ent-/sperren des Desktop registriert!', 5)
    EndFunc

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

    Func _End()
    If MsgBox(36, 'Desktopsperre', 'Programm beenden?') = 6 then Exit
    EndFunc

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

    Func _ToggleMonitor($hwnd, $OnOff)
    Local Const $WM_SYSCOMMAND = 274
    Local Const $SC_MONITORPOWER = 61808
    _SendMessage($hWnd, $WM_SYSCOMMAND, $SC_MONITORPOWER, $OnOff)
    If @error Then
    MsgBox(0,"_ToggleMonitor", "_SendMessage Error: " & @error)
    Exit
    EndIf
    EndFunc

    [/autoit]