#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <WinAPI.au3>
;#NoTrayIcon

Global $ah_MouseKeyboard_WinHooks[7]

$sTitle = "Sperre"
$hGui = GUICreate($sTitle, @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, $WS_EX_TOOLWINDOW)
		GUISetBkColor(0x000000)
		GUICtrlCreateLabel("GESPERRT", @DesktopWidth/2-160, @DesktopHeight/2-30, 320, 300, $SS_CENTER)
		GUICtrlSetFont(-1, 42, 600, 0, 'Arial')
		GUICtrlSetColor(-1, 0xEE4444)
		GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
		WinSetTrans($hGui, '', 180)
		

If _Singleton($sTitle, 1) = 0 Then
		MsgBox(48, "Information", "Die Sperre läuft bereits!")
		Exit
EndIf
MsgBox(0, "Information", "Die Computer-Sperre wurde aktiviert.")


While 1
	sleep(10)
		
	If WinExists("Task-Manager") Then
		WinClose("Task-Manager")
		_MouseTrap(@DesktopWidth - 1, @DesktopHeight - 1, @DesktopWidth - 1, @DesktopHeight - 1)
		WinSetOnTop($sTitle, "", 1)
		
	ElseIf _IsPressed("11") And _IsPressed("12") And _IsPressed("4C") Then; Aktivierung der Sperre (Strg + Alt + L)
		If WinActive($sTitle) Then 
			sleep(10)
		Else
			_MouseTrap(@DesktopWidth - 1, @DesktopHeight - 1, @DesktopWidth - 1, @DesktopHeight - 1)
			_DisEnableTaskManager(1)
			WinSetState("Windows Task Manager", '', @SW_DISABLE)
			If WinExists("Task-Manager") Then WinClose("Task-Manager")
			GUISetState(@SW_SHOW, $hGui)
			WinSetOnTop($sTitle, "", 1)
			
			_BlockInputEx(3, "l"); <= Sperrt Tastatur außer die taste L... Falls nach entsperren keine taste mehr angenommen wird, hier einfach die 0 einsetzen und erneut ausführen. Danach gehts wieder!!!
			
		EndIf

	ElseIf _IsPressed("01") And _IsPressed("02") And _IsPressed("4C") Then; Deaktivierung der Sperre (Linke Maustaste + Rechte Maustaste + L)
		_MouseTrap()
		_DisEnableTaskManager(0)
		WinSetState("Windows Task Manager", '', @SW_ENABLE)
		GUISetState(@SW_HIDE, $hGui)
		
		_BlockInputEx(0); <= Sollte zumindest alles wieder Entsperren
		
	ElseIf WinActive($sTitle) Then
		_MouseTrap(@DesktopWidth - 3, @DesktopHeight - 1, @DesktopWidth - 3, @DesktopHeight - 1)
		sleep(10)
		_MouseTrap(@DesktopWidth - 1, @DesktopHeight - 1, @DesktopWidth - 1, @DesktopHeight - 1)
	EndIf
WEnd

Func _DisEnableTaskManager($DISABLE=1)
	If $DISABLE <> 0 Then $DISABLE = 1
	Local $key = 'HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System'
	Local $val = 'DisableTaskMgr'
	RegWrite($key, $val, 'REG_DWORD', $DISABLE)
	If @error Then
		Return SetError(@error, 0, 0)
	Else
		Return 1
	EndIf
EndFunc

;#################### so hier fangen die funktionen an, welche ich aber einfach nur aus der orginal-datei rauskopiert habe ############################

Func _BlockInputEx($iBlockMode = -1, $sExclude = "", $sInclude = "", $hWindows = "")
	If $iBlockMode < -1 Or $iBlockMode > 3 Then Return SetError(1, 0, 0) ;Only -1 to 3 modes are supported.
	
	If $iBlockMode <= 0 Then Return _BlockInput_UnhookWinHooks_Proc()
	
	Local $pStub_KeyProc = 0, $pStub_MouseProc = 0, $hHook_Keyboard = 0, $hHook_Mouse = 0
	Local $hHook_Module = _WinAPI_GetModuleHandle(0)
	
	For $i = 0 To 3
		If $ah_MouseKeyboard_WinHooks[$i] > 0 Then
			_BlockInput_UnhookWinHooks_Proc()
			ExitLoop
		EndIf
	Next
	
	If $iBlockMode = 1 Or $iBlockMode = 2 Then
		$pStub_MouseProc = DllCallbackRegister("_MouseHook_Proc", "int", "int;ptr;ptr")
		$hHook_Mouse = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($pStub_MouseProc), $hHook_Module, 0)
	EndIf
	
	If $iBlockMode = 1 Or $iBlockMode = 3 Then
		$pStub_KeyProc = DllCallbackRegister("_KeyBoardHook_Proc", "int", "int;ptr;ptr")
		$hHook_Keyboard = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($pStub_KeyProc), $hHook_Module, 0)
	EndIf
	
	$ah_MouseKeyboard_WinHooks[0] = $pStub_KeyProc
	$ah_MouseKeyboard_WinHooks[1] = $pStub_MouseProc
	$ah_MouseKeyboard_WinHooks[2] = $hHook_Keyboard
	$ah_MouseKeyboard_WinHooks[3] = $hHook_Mouse
	$ah_MouseKeyboard_WinHooks[4] = "|" & _Parse_vmCodesList_CLASSes(_Parse_vkCodesList_CLASSes($sInclude)) & "|"
	$ah_MouseKeyboard_WinHooks[5] = "|" & _Parse_vmCodesList_CLASSes(_Parse_vkCodesList_CLASSes($sExclude)) & "|"
	$ah_MouseKeyboard_WinHooks[6] = "|" & $hWindows & "|"
	
	Return 1
EndFunc

;KeyBoard hook processing function
Func _KeyBoardHook_Proc($nCode, $wParam, $lParam)
	If $nCode < 0 Then Return _WinAPI_CallNextHookEx($ah_MouseKeyboard_WinHooks[4], $nCode, $wParam, $lParam)
	
	Local $KBDLLHOOKSTRUCT = DllStructCreate("dword vkCode;dword scanCode;dword flags;dword time;ptr dwExtraInfo", $lParam)
	Local $vkCode = "0x" & Hex(DllStructGetData($KBDLLHOOKSTRUCT, "vkCode"), 2)
	
	Local $sInclude = $ah_MouseKeyboard_WinHooks[4]
	Local $sExclude = $ah_MouseKeyboard_WinHooks[5]
	Local $hWnds = $ah_MouseKeyboard_WinHooks[6]
	
	If $sInclude <> "||" Then 	;Include proc
		If StringInStr($sInclude, "|" & $vkCode & "|") And _
			($hWnds = "||" Or StringInStr($hWnds, "|" & WinGetHandle("[ACTIVE]") & "|")) Then Return 1 ;Block processing!
	Else 						;Exclude proc
		If Not StringInStr($sExclude, "|" & $vkCode & "|") And _
			($hWnds = "||" Or StringInStr($hWnds, "|" & WinGetHandle("[ACTIVE]") & "|")) Then Return 1 ;Block processing!
	EndIf
	
	_WinAPI_CallNextHookEx($ah_MouseKeyboard_WinHooks[2], $nCode, $wParam, $lParam) ;Continue processing
EndFunc

;Mouse hook processing function
Func _MouseHook_Proc($nCode, $wParam, $lParam)
	If $nCode < 0 Then Return _WinAPI_CallNextHookEx($ah_MouseKeyboard_WinHooks[3], $nCode, $wParam, $lParam) ;Continue processing
	
	Local $iMouse_Event = BitAND($wParam, 0xFFFF)
	;Add mouse exclude/include actions support...
	
	Local $sInclude = $ah_MouseKeyboard_WinHooks[4]
	Local $sExclude = $ah_MouseKeyboard_WinHooks[5]
	Local $hWnds = $ah_MouseKeyboard_WinHooks[6]
	
	If $sInclude <> "||" Then 	;Include proc
		If StringInStr($sInclude, "|" & $iMouse_Event & "|") And _
			($hWnds = "||" Or StringInStr($hWnds, "|" & WinGetHandle("[ACTIVE]") & "|")) Then Return 1 ;Block processing!
	Else 						;Exclude proc
		If Not StringInStr($sExclude, "|" & $iMouse_Event & "|") And _
			($hWnds = "||" Or StringInStr($hWnds, "|" & WinGetHandle("[ACTIVE]") & "|")) Then Return 1 ;Block processing!
	EndIf
	
	Return _WinAPI_CallNextHookEx($ah_MouseKeyboard_WinHooks[3], $nCode, $wParam, $lParam) ;Continue processing
EndFunc

;Releases callbacks and Unhook Windows hooks
Func _BlockInput_UnhookWinHooks_Proc()
	;Release KeyBoard callback function
	If $ah_MouseKeyboard_WinHooks[0] > 0 Then 
		DllCallbackFree($ah_MouseKeyboard_WinHooks[0])
		$ah_MouseKeyboard_WinHooks[0] = 0
	EndIf
	
	;Release Mouse callback function
	If $ah_MouseKeyboard_WinHooks[1] > 0 Then
		DllCallbackFree($ah_MouseKeyboard_WinHooks[1])
		$ah_MouseKeyboard_WinHooks[1] = 0
	EndIf
	
	;Release KeyBoard Window hook
	If IsPtr($ah_MouseKeyboard_WinHooks[2]) Then
		_WinAPI_UnhookWindowsHookEx($ah_MouseKeyboard_WinHooks[2])
		$ah_MouseKeyboard_WinHooks[2] = 0
	EndIf
	
	;Release Mouse Window hook
	If IsPtr($ah_MouseKeyboard_WinHooks[3]) Then
		_WinAPI_UnhookWindowsHookEx($ah_MouseKeyboard_WinHooks[3])
		$ah_MouseKeyboard_WinHooks[3] = 0
	EndIf
	
	Return 1
EndFunc

Func _Parse_vkCodesList_CLASSes($sList)
	$sList = StringRegExpReplace($sList, "(?i)\{(Ctrl|Shift|Alt)\}", "{L$1}|{R$1}") ;Fix for Ctrl/Shift/Alt keys (add L/R to them)
	
	Local $a_vkCode_List = StringSplit($sList, "|")
	Local $sRet_Keys = ""
	
	For $i = 1 To $a_vkCode_List[0]
		Switch $a_vkCode_List[$i]
			Case "[:FUNC:]"
				$a_vkCode_List[$i] = "0x70|0x71|0x72|0x73|0x74|0x75|0x76|0x77|0x78|0x79|0x7A|0x7B|0x7C|" & _
						"0x7D|0x7E|0x7F|0x80H|0x81H|0x82H|0x83H|0x84H|0x85H|0x86H|0x87H"
			Case "[:ALPHA:]"
				$a_vkCode_List[$i] = "0x41|0x42|0x43|0x44|0x45|0x46|0x47|0x48|0x49|0x4A|0x4B|0x4C|0x4D|" & _
						"0x4E|0x4F|0x50|0x51|0x52|0x53|0x54|0x55|0x56|0x57|0x58|0x59|0x5A"
			Case "[:NUMBER:]"
				$a_vkCode_List[$i] = "0x30|0x31|0x32|0x33|0x34|0x35|0x36|0x37|0x38|0x39|0x60|0x61|0x62|" & _
						"0x63|0x64|0x65|0x66|0x67|0x68|0x69"
			Case "[:ARROWS:]"
				$a_vkCode_List[$i] = "0x25|0x26|0x27|0x28"
			Case "[:SPECIAL:]"
				$a_vkCode_List[$i] = "0x08|0x09|0x0C|0x0D|0x10|0x11|0x12|0x13|0x14|0x1B|0x20|0x21|0x22|" & _
						"0x23|0x24|0x29|0x2A|0x2B|0x2C|0x2D|0x2E|0x5B|0x5C|0x6A|0x6B|0x6C|" & _
						"0x6D|0x6E|0x6F|0x90|0x91|0xA0|0xA1|0xA2|0xA3|0xA4|0xA5|0xBA|0xBB|" & _
						"0xBC|0xBD|0xBE|0xBF|0xC0|0xDB|0xDC|0xDD"
			Case Else
				$a_vkCode_List[$i] = _KeyStr_To_vkCode($a_vkCode_List[$i])
		EndSwitch
		
		$sRet_Keys &= $a_vkCode_List[$i] & "|"
	Next
	
	Return StringRegExpReplace($sRet_Keys, "\|+$", "")
EndFunc

Func _Parse_vmCodesList_CLASSes($sList)
	Local Const $MOUSE_MOVE_EVENT				= 512
	Local Const $MOUSE_PRIMARYDOWN_EVENT		= 513
	Local Const $MOUSE_PRIMARYUP_EVENT			= 514
	Local Const $MOUSE_SECONDARYDOWN_EVENT		= 516
	Local Const $MOUSE_SECONDARYUP_EVENT		= 517
	Local Const $MOUSE_WHEELDOWN_EVENT			= 519
	Local Const $MOUSE_WHEELUP_EVENT			= 520
	Local Const $MOUSE_WHEELSCROLL_EVENT		= 522
	Local Const $MOUSE_SPECIALBUTTONDOWN_EVENT	= 523
	Local Const $MOUSE_SPECIALBUTTONUP_EVENT	= 524
	
	Local $a_vmCode_List = StringSplit($sList, "|")
	Local $sRet_Keys = ""
	
	For $i = 1 To $a_vmCode_List[0]
		Switch $a_vmCode_List[$i]
			Case "{MMOVE}"
				$a_vmCode_List[$i] = $MOUSE_MOVE_EVENT
			Case "{MPDOWN}"
				$a_vmCode_List[$i] = $MOUSE_PRIMARYDOWN_EVENT
			Case "{MPUP}"
				$a_vmCode_List[$i] = $MOUSE_PRIMARYUP_EVENT
			Case "{MSDOWN}"
				$a_vmCode_List[$i] = $MOUSE_SECONDARYDOWN_EVENT
			Case "{MSUP}"
				$a_vmCode_List[$i] = $MOUSE_SECONDARYUP_EVENT
			Case "{MWDOWN}"
				$a_vmCode_List[$i] = $MOUSE_WHEELDOWN_EVENT
			Case "{MWUP}"
				$a_vmCode_List[$i] = $MOUSE_WHEELUP_EVENT
			Case "{MWSCROLL}"
				$a_vmCode_List[$i] = $MOUSE_WHEELSCROLL_EVENT
			Case "{MSPDOWN}"
				$a_vmCode_List[$i] = $MOUSE_SPECIALBUTTONDOWN_EVENT
			Case "{MSPUP}"
				$a_vmCode_List[$i] = $MOUSE_SPECIALBUTTONUP_EVENT
		EndSwitch
		
		$sRet_Keys &= $a_vmCode_List[$i] & "|"
	Next
	
	Return StringRegExpReplace($sRet_Keys, "\|+$", "")
EndFunc

Func _KeyStr_To_vkCode($sKeyStr)
	Local $sRet_Keys = "", $aDelim_Keys[1]
	Local $aKeys = StringSplit("{LMouse}|{RMouse}|{}|(MMouse}|{}|{}|{}|{BACKSPACE}|{TAB}|{}|{}|{}|{ENTER}|{}|{}|{SHIFT}|{CTRL}|{ALT}|{PAUSE}|{CAPSLOCK}|{}|{}|{}|{}|{}|{}|{ESC}|{}|{}|{}|{]|{SPACE}|{PGUP}|{PGDN}|{END}|{HOME}|{LEFT}|{UP}|{RIGHT}|{DOWN}|{SELECT}|{PRINTSCREEN}|{}|{PRINTSCREEN}|{INSERT}|{DEL}|{}|0|1|2|3|4|5|6|7|8|9|{}|{}|{}|{}|{}|{}|{}|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|{LWIN}|{RWIN}|{APPSKEY}|{}|{SLEEP}|{numpad0}|{numpad1}|{numpad2}|{numpad3}|{numpad4}|{numpad5}|{numpad6}|{numpad7}|{numpad8}|{numpad9}|{NUMPADMULT}|{NUMPADADD}|{}|{NUMPADSUB}|{NUMPADDOT}|{NUMPADDIV}|{F1}|{F2}|{F3}|{F4}|{F5}|{F6}|{F7}|{F8}|{F9}|{F10}|{F11}|{F12}|{F13}|{F14}|{F15}|{F16}|{F17}|{F18}|{F19}|{F20}|{F21}|{F22}|{F23}|{F24}|{}|{}|{}|{}|{}|{}|{}|{}|{NUMLOCK}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{LSHIFT}|{RSHIFT}|{LCTRL}|{RCTRL}|{LALT}|{RALT}|{BROWSER_BACK}|{BROWSER_FORWARD}|{BROWSER_REFRESH}|{BROWSER_STOP}|{BROWSER_SEARCH}|{BROWSER_FAVORITES}|{BROWSER_HOME}|{VOLUME_MUTE}|{VOLUME_DOWN}|{VOLUME_UP}|{MEDIA_NEXT}|{MEDIA_PREV}|{MEDIA_STOP}|{MEDIA_PLAY_PAUSE}|{LAUNCH_MAIL}|{LAUNCH_MEDIA}|{LAUNCH_APP1}|{LAUNCH_APP2}|{}|{}|;|{+}|,|{-}|.|/|`|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|{}|[|\|]|'", "|")
	
	If StringRegExp($sKeyStr, "\A\[|\]\z") Then
		$sKeyStr = StringRegExpReplace($sKeyStr, "\A\[|\]\z", "")
		$sKeyStr = StringRegExpReplace($sKeyStr, "(.)", "\1|")
		$sKeyStr = StringRegExpReplace($sKeyStr, "\|+$", "")
		
		$aDelim_Keys = StringSplit($sKeyStr, "")
	EndIf
	
	For $i = 1 To $aKeys[0]
		If $aDelim_Keys[0] > 1 Then
			For $j = 1 To $aDelim_Keys[0]
				If $aKeys[$i] = $aDelim_Keys[$j] Then $sRet_Keys &= "0x" & Hex($i, 2) & "|"
			Next
		Else
			If $aKeys[$i] = $sKeyStr Then Return "0x" & Hex($i, 2)
		EndIf
	Next
	
	If $sRet_Keys = "" Then Return $sKeyStr
	Return StringRegExpReplace($sRet_Keys, "\|+$", "")
EndFunc
