- 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
#include<MenuConstants.au3>
#include<SendMessage.au3>
#include<WindowsConstants.au3>
#include<Misc.au3>
Opt('GUICloseOnESC', 0)
Opt('TrayIconHide', 1)
Opt('TrayAutoPause', 0)
Opt('WinTitleMatchMode', 4)
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()
Global $gui = GUICreate($gui_titel)
GUIRegisterMsg($WM_DEVICECHANGE, 'MY_WM_DEVICECHANGE')
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
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
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
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
Func _End()
If MsgBox(36, 'Desktopsperre', 'Programm beenden?') = 6 then Exit
EndFunc
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