#include <File.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>


Global $width = 120, $height = 80, $hWnd
Global $sCaptcha

$hWnd = GUICreate("GDI+ Captcha", 500, 500 + 60, -1, -1, -1, 0x00000080)

$inpt = GUICtrlCreateInput("Captcha", 30, 510, 90, 30)
$btn = GUICtrlCreateButton("Check", 140, 510, 90, 30)
$redraw = GUICtrlCreateButton("Captcha erneuern", 260, 510, 90, 30)
GUISetState()
$hWndCaptchaGui = GUICreate("",$width,$height,50,50,$WS_CHILD, 0,$hWnd)
GUISetState()

_GDIPlus_Startup()
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWndCaptchaGui)
_DrawCaptcha()

While 1
	$msg = GUIGetMsg()
	Switch $msg
		Case -3
			_Dispose()
		Case $btn
			_CaptchaCheck()
		Case $redraw
			_DrawCaptcha(Random(1, 4, 1))
	EndSwitch
WEnd

Func _Dispose()

	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_Shutdown()
	Exit
EndFunc

Func _DrawCaptcha($iIndex = "")
	Local $rndX = Random(10, 20)
	Local $rndY = Random(10, 20)
	_GDIPlus_GraphicsClear($hGraphic,0xffffffff)
	Global $sCaptcha = _CreateCaptcha()
	Local $hBitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $hGraphic)
	Local $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

	If Not $iIndex Then
		_GDIPlus_GraphicsDrawString($hBackbuffer , $sCaptcha, $rndX, $rndY,"Arial",Random(14,17,1))
	Else
		_GDIPlus_GraphicsDrawString($hBackbuffer , $sCaptcha, $rndX, $rndY,"Arial",Random(14,17,1))
	EndIf
	For $i = 0 To 10
		_GDIPlus_GraphicsDrawLine($hBackbuffer , $rndX - 7, $rndY - 5, $rndX + 20, $rndY + 15)
		$rndX += Random(5,7)
		$rndY += Random(0.5,1)
	Next
	Do
		Local $iRandSkewX = Random(-30,30,1)
	Until $iRandSkewX < 20 Or $iRandSkewX > 20

	_GDIPlus_DrawImagePoints($hGraphic,$hBitmap,0,$iRandSkewX,$width,15,0,$height)
	_GDIPlus_bitmapDispose($hBitmap)
	_GDIPlus_ImageDispose($hBackbuffer)
EndFunc

Func _CreateCaptcha($iLen = 6)
	Local $i,$sRet
	Do
		$i += 1
		If Random(0,2,1) < 1 Then
			$sRet &= Random(1,9,1)
		Else
			$sRet &= Chr(Random(65,90,1))
		EndIf
	Until $i = $iLen
	Return $sRet

EndFunc


Func _CaptchaCheck()
	Local $inptTxt = GUICtrlRead($inpt)
	If $inptTxt == $sCaptcha Then
		MsgBox(0, "Korrekt", "Das war der richtige Captcha!")
	Else
		MsgBox(0, "Zugang verweigert", "Falscher Captcha!")
		_DrawCaptcha()
	EndIf
EndFunc