Da ich mal wieder langeweile hatte und was neues in Sachen AutoIt suchte, habe ich zwei kleine Captcha Funktionen geschrieben:
Beispiel
;Test: _captcha
$cap1 = _captcha(500, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", "_captcha Test")
If $cap1 = True Then
MsgBox(0, "_captcha", "Richtiges Captcha eingegeben oder das Fenster wurde vorzeitig geschlossen (Rückgabe: True)")
Else
MsgBox(0, "_captcha", "Falsches Captcha eingegeben (Rückgabe: False)")
EndIf
;Test: _captchaEmb
$form = GUICreate("_captchaEmb Test", 292, 55, 192, 124)
$pic = GUICtrlCreatePic("", 0, 0, 292, 55)
$cap2 = _captchaEmb($form, $pic)
WinSetTitle($form, "", "_captchaEmb Test (" & $cap2 & ")")
GUISetState(@SW_SHOW)
While 1
If GUIGetMsg() = -3 Then Exit
WEnd
UDF
#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit];Danke an ProgAndy für die Hilfestellung bei GDI+
; #FUNCTION# ====================================================================================================================
; Name...........: _captchaEmb
; Description ...: Erstellt ein Captcha in einem Picc-controll
; Syntax.........: _captchaEmb($hWnd, $hPic, $iPoints = 500, $sLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", $sTitle = "Captcha", $sMsg = "Please insert the Code in the picture:", $sFont = "Times New Roman", $iSize = 10, $bBold = True)
; Parameters ....: $hWnd - Handle des Fenster indem sich das Pic-controll befindet
; $hPic - Handle des Pic-controlls
; $iPoints - Punkte die über die Schrift gezeichnet werden
; $sLetters - Buchstaben die im Captcha verwendet werden sollen
; $sTitle - Der Titel des Fensters
; $iMsg - Die Nachricht die im Fenster erscheind
; $sFont - Schriftart in der die Buchstaben geschrieben werden sollen
; $iSize - Schriftgröße in der die Buchstaben geschrieben werden sollen
; $bBold - Schrift dick schreiben (True - Ja;False - Nein)
; Return values .: Erfolg - Gibt den Captchacode zurück
; Fehler - Gibt -1 zurück und setzt @error auf 1
; Author ........: Carsten8
; Remarks .......: Das Bild wird in der Breite 292 und der Höhe 55 erstellt!
; ===============================================================================================================================
Func _captchaEmb($hWnd, $hPic, $iPoints = 500, $sLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", $sTitle = "Captcha", $sMsg = "Please insert the Code in the picture:", $sFont = "Times New Roman", $iSize = 10, $bBold = True)
Local $iLen = 10, $sCaptcha
For $i = 1 To $iLen
$sCaptcha &= StringMid($sLetters, Random(1, StringLen($sLetters)), 1)
Next
If Not IsHWnd($hWnd) Then
SetError(1)
Return -1
EndIf
_GDIPlus_Startup()
$capGraph = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hBMP = _GDIPlus_BitmapCreateFromGraphics(292,55,$capGraph)
_GDIPlus_GraphicsDispose($capGraph)
$capGraph = _GDIPlus_ImageGetGraphicsContext($hBMP)
_GDIPlus_GraphicsFillRect($capGraph, 0, 0, 292, 55, _GDIPlus_BrushCreateSolid(0xFFFEFEFE))
For $iL = 1 To $iLen
$rand = Random(0, 40)
_GDIPlus_GraphicsDrawString($capGraph, StringMid($sCaptcha, $iL, 1), $iL * 25, $rand, $sFont, $iSize)
If $bBold = True Then _GDIPlus_GraphicsDrawString($capGraph, StringMid($sCaptcha, $iL, 1), $iL * 25 + 1, $rand, $sFont, $iSize)
Next
For $capLines = 1 To $iPoints
$randx = Random(0, 292)
$randy = Random(0, 55)
_GDIPlus_GraphicsDrawLine($capGraph, $randx, $randy, $randx + 1, $randy + 1)
Next
$hBitmap_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBMP)
_SetBitmapToCtrl($hPic, $hBitmap_GDI)
_GDIPlus_GraphicsDispose($capGraph)
_GDIPlus_BitmapDispose($hBMP)
_GDIPlus_Shutdown()
Return $sCaptcha
EndFunc
; #FUNCTION# ====================================================================================================================
; Name...........: _captcha
; Description ...: Erstellt ein Fenster mit einem Captcha.
; Syntax.........: _captcha($iPoints = 500, $sLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", $sTitle = "Captcha", $sMsg = "Please insert the Code in the picture:", $sFont = "Times New Roman", $iSize = 10, $bBold = True)
; Parameters ....: $iPoints - Punkte die über die Schrift gezeichnet werden
; $sLetters - Buchstaben die im Captcha verwendet werden sollen
; $sTitle - Der Titel des Fensters
; $iMsg - Die Nachricht die im Fenster erscheind
; $sFont - Schriftart in der die Buchstaben geschrieben werden sollen
; $iSize - Schriftgröße in der die Buchstaben geschrieben werden sollen
; $bBold - Schrift dick schreiben (True - Ja;False - Nein)
; Return values .: Richtiges Captcha - True
; Falsches Captcha - False
; Author ........: Carsten8
; Remarks .......: Gibt auch False zurück wenn das Fenster vom Benutzer geschlossen wurde.
; ===============================================================================================================================
Func _captcha($iPoints = 500, $sLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", $sTitle = "Captcha", $sMsg = "Please insert the Code in the picture:", $sFont = "Times New Roman", $iSize = 10, $bBold = True)
Local $iLen = 10, $sCaptcha
For $i = 1 To $iLen
$sCaptcha &= StringMid($sLetters, Random(1, StringLen($sLetters)), 1)
Next
$capWin = GUICreate($sTitle, 309, 164, 303, 235)
GUICtrlCreateLabel($sMsg, 4, 4, 300, 17)
GUICtrlCreateGroup("Captcha", 4, 24, 300, 77)
$capPic = GUICtrlCreatePic("",8,40,292,55)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$capIn = GUICtrlCreateInput("", 4, 104, 300, 21)
$capOK = GUICtrlCreateButton("OK", 120, 132, 75, 25, 0)
GUISetState(@SW_SHOW, $capWin)
_GDIPlus_Startup()
$capGraph = _GDIPlus_GraphicsCreateFromHWND($capWin)
$hBMP = _GDIPlus_BitmapCreateFromGraphics(292,55,$capGraph)
_GDIPlus_GraphicsDispose($capGraph)
$capGraph = _GDIPlus_ImageGetGraphicsContext($hBMP)
_GDIPlus_GraphicsFillRect($capGraph, 0, 0, 292, 55, _GDIPlus_BrushCreateSolid(0xFFFEFEFE))
For $iL = 1 To $iLen
$rand = Random(0, 40)
_GDIPlus_GraphicsDrawString($capGraph, StringMid($sCaptcha, $iL, 1), $iL * 25, $rand, $sFont, $iSize)
If $bBold = True Then _GDIPlus_GraphicsDrawString($capGraph, StringMid($sCaptcha, $iL, 1), $iL * 25 + 1, $rand, $sFont, $iSize)
Next
For $capLines = 1 To $iPoints
$randx = Random(0, 292)
$randy = Random(0, 55)
_GDIPlus_GraphicsDrawLine($capGraph, $randx, $randy, $randx + 1, $randy + 1)
Next
$hBitmap_GDI = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBMP)
_SetBitmapToCtrl($capPic, $hBitmap_GDI)
_GDIPlus_GraphicsDispose($capGraph)
_GDIPlus_BitmapDispose($hBMP)
_GDIPlus_Shutdown()
While 1
$mGUI = GUIGetMsg(1)
Switch $mGUI[0]
Case -3
GUIDelete($capWin)
Return False
Case $capOK
If GUICtrlRead($capIn) = $sCaptcha Then
GUIDelete($capWin)
Return True
Else
GUIDelete($capWin)
Return False
EndIf
EndSwitch
WEnd
EndFunc
Func _SetBitmapToCtrl($CtrlId, $hBitmap)
Local Const $STM_SETIMAGE = 0x0172
Local Const $IMAGE_BITMAP = 0
Local Const $SS_BITMAP = 0xE
Local Const $GWL_STYLE = -16
Local $hWnd = GUICtrlGetHandle($CtrlId)
If $hWnd = 0 Then Return SetError(1, 0, 0)
Local $oldStyle = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE)
If @error Then Return SetError(2, 0, 0)
DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE, "long", BitOR($oldStyle[0], $SS_BITMAP))
If @error Then Return SetError(3, 0, 0)
Local $oldBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
If @error Then Return SetError(4, 0, 0)
If $oldBmp[0] <> 0 Then DllCall("GDI32.dll", "int", "DeleteObject", "int", $oldBmp[0])
Return 1
EndFunc
Freue mich auf Kritik und Kommentare dazu
Es ist meine erste Funktion in der GDI+ vorkommt und die erste Funktion die ich veröffentliche, seid also nicht allzu pingelich
Gruß
Carsten