So ich hab mal ein InputFeld für ein Passwort hinzugefügt, falls man mal den USB-Stick nicht findet:
Spoiler anzeigen
;~ #RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=Desktopsperre.ico
#AutoIt3Wrapper_outfile=Desktopsperre.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Fileversion=1.2.0.0
#AutoIt3Wrapper_Res_LegalCopyright=Oscar
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#NoTrayIcon
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <MenuConstants.au3>
#include <SendMessage.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
Opt('GUIOnEventMode', 1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Global $sTitle = 'Desktopsperre v1.2'
If _Singleton($sTitle, 1) = 0 Then
MsgBox(48, "Error " & $sTitle, 'Das Programm läuft bereits!')
Exit
EndIf
Global $Password = "Password"
Global $sIni = @ScriptDir & '\Desktopsperre.ini'
If Not IsDeclared('WM_DEVICECHANGE') Then Global Const $WM_DEVICECHANGE = 0x0219
Global Const $Off = 2, $On = -1
Global $hMonitor = WinGetHandle('classname=Progman')
Global $startmenu = WinGetHandle("[class:DV2ControlHost]")
$taskbar_pos = WinGetPos("[class:Shell_TrayWnd]")
Global $bLock = False
Global $usbstor = 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\usbstor\Enum'
RegRead($usbstor, 'count')
If @error Then Exit MsgBox(48, "Error " & $sTitle, 'Konnte Registryeintrag nicht lesen!')
Global $sID = IniRead($sIni, 'ID', '1', '')
If $sID = '' Then _RegID()
;~ TraySetIcon(@ScriptDir & '\Desktopsperre.ico')
;~ TrayCreateItem('USB-Stick registrieren')
;~ TrayItemSetOnEvent(-1, '_RegID')
;~ TrayCreateItem('')
;~ TrayCreateItem('Programm beenden')
;~ TrayItemSetOnEvent(-1, '_End')
$hGui = GUICreate($sTitle, 0, 0, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW)
GUISetBkColor(0x000000, $hGui)
$Label1 = GUICtrlCreateLabel('GESPERRT', @DesktopWidth/2-160, @DesktopHeight/2-110, 320, 60, $SS_CENTER)
GUICtrlSetFont($Label1, 42, 600, 0, 'Arial')
GUICtrlSetColor($Label1, 0xEE4444)
GUICtrlSetBkColor($Label1, $GUI_BKCOLOR_TRANSPARENT)
$Label2 = GUICtrlCreateLabel("Bitte stecken sie den registrierten USB-Stick oder geben Sie ein gültiges Passwort ein, um die Sperre aufzuheben", @DesktopWidth/2-160, @DesktopHeight/2-40, 320, 60, $SS_CENTER)
GUICtrlSetFont($Label2, 12, 600, 0, 'Arial')
GUICtrlSetColor($Label2, 0xEE4444)
GUICtrlSetBkColor($Label2, $GUI_BKCOLOR_TRANSPARENT)
$PasswordInput = GUICtrlCreateInput("", @DesktopWidth/2-170, @DesktopHeight/2+30, 340, 60, 0x0020)
GUICtrlSetFont($PasswordInput, 36, 600, 0, 'Arial')
GUICtrlSetColor($PasswordInput, 0xEE4444)
GUICtrlSetCursor($PasswordInput, 5)
$ExitButton = GUICtrlCreateButton("Beenden", 50, 32, 100, 22)
GUICtrlSetOnEvent($ExitButton, "_End")
GUICtrlSetState($ExitButton, $GUI_HIDE)
$RestoreButton = GUICtrlCreateButton("Wiederherstellen", 50, 62, 100, 22)
GUICtrlSetOnEvent($RestoreButton, "_Restore")
GUISetState(@SW_SHOW, $hGui)
[/autoit] [autoit][/autoit] [autoit]WinSetTrans($hGui, '', 245)
GUIRegisterMsg($WM_DEVICECHANGE, 'MY_WM_DEVICECHANGE')
While 1
sleep(10)
If $bLock() Then
;~ _ToggleMonitor($hMonitor, $Off)
GUICtrlSetState($RestoreButton, $GUI_HIDE)
GUICtrlSetState($ExitButton, $GUI_HIDE); Exit Button ausblenden
WinMove($sTitle, "", 0, 0, @DesktopWidth, @DesktopHeight); Fenster über den ganzen Bildschirm ausbreiten
_MouseTrap(@DesktopWidth/2-170, @DesktopHeight/2+30, @DesktopWidth/2-170+340, @DesktopHeight/2+30+60); Maus über der Inputbox einfrieren
WinKill("Windows Task-Manager"); TaskManager schließen
WinSetOnTop("Desktopsperre v1.2", "", 1); Fenster über alles andere legen
WinSetState("[class:Shell_TrayWnd]", "", @SW_HIDE); TasBar ausblenden
WinKill("[class:DV2ControlHost]"); Startmenü unter dem Fenser zeigen
If GUICtrlRead($PasswordInput) = $Password Then; $PasswordInput überprüfen
GUICtrlSetState($RestoreButton, $GUI_SHOW); Wiederherstellen Button einblenden
$bLock = False
EndIf
Else
;~ _ToggleMonitor($hMonitor, $On)
_MouseTrap(); Maus wieder freigeben
WinSetOnTop("Desktopsperre v1.2", "", 0); Fenster legt sich nichtmehr über alles andere
GUICtrlSetState($ExitButton, $GUI_SHOW); Exit Button einblenden
GUICtrlSetData($PasswordInput, ""); $PasswordInput leeren
WinMove($sTitle, "", @DesktopWidth/1.2, @DesktopHeight/1.5 + 200, @DesktopWidth, @DesktopHeight); Fenster an ins untere rechte Eck verschieben
WinSetState("[class:Shell_TrayWnd]", "", @SW_SHOW); TasBar einblenden
EndIf
Wend; Schleife fortsetzen
Func MY_WM_DEVICECHANGE($hWnd, $Msg, $wParam, $lParam)
$bLock = True
For $count = 0 To RegRead($usbstor, 'count') - 1; Schleife für alle USB-Wechseldatenträger
If $sID = RegRead($usbstor, $count) Then $bLock = False
Next
EndFunc
Func _RegID()
Local $count
MsgBox(0, $sTitle, 'Falls der USB-Stick momentan eingesteckt ist,' & @CRLF & 'bitte entfernen und dann auf [Ok] klicken!')
$count = RegRead($usbstor, 'count')
MsgBox(0, $sTitle, '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, $sTitle, 'Dieser USB-Stick ist nun zum ent-/sperren des Desktop registriert!', 5)
EndFunc
Func _End()
$ExitMessage = MsgBox(36, "Meldung " & $sTitle, 'Programm beenden?')
If $ExitMessage = 6 Then
Exit
EndIf
EndFunc
Func _ToggleMonitor($hwnd, $OnOff)
Local Const $WM_SYSCOMMAND = 0x0112
Local Const $SC_MONITORPOWER = 0xF170
_SendMessage($hWnd, $WM_SYSCOMMAND, $SC_MONITORPOWER, $OnOff)
If @error Then Exit MsgBox(0, $sTitle, '_SendMessage Error: ' & @error)
EndFunc
Func _Restore()
$bLock = True
EndFunc
Nur stört mich, wenn man nun START drückt, blinkt das Startmenü kurz über der GUi auf. Habe bis jetzt noch keine Lösung dafür gefunden.