joystickus Posted October 17, 2011 Posted October 17, 2011 Greetings, Dear Members! Foreword: I am completely new to any kind of programming and this is my first experience both with AutoIt and programming. Overall task I need: to compare a certain area of the screen with a given template for two states -- identical or not. Here my thoughts: I made a template in a lossless format 24-bit bmp (size 12*27px). Then I can make a script to capture the same area from the screen to a temp file next to the template. And then I can compare them in their binary data and to see if it is identical of not. (When done by hands -- it gives pure picture with no mistakes.) In more details as I see it: I need to get the binary data of the template to a variable, then to capture the same area from the screen, to save it to a temp file and to get the binary data of the temp file to another variable. Then to compare those variables and go forward by one of the two ways depending on whether they are identical of not. Skipping a step would be to get the binary data to a second variable (from the screen) directly from the buffer when the area is captured. And here's a problem: I didn't manage to find the way in AutoIt to get the binary data of the *.bmp file to a variable and/or from the buffer. Can you please give me a hint of the operators I need to use to do that simple task? Thank you for your attention.
Zedna Posted October 17, 2011 Posted October 17, 2011 Search this forum. This was answered many times already. Resources UDF ResourcesEx UDF AutoIt Forum Search
Blue_Drache Posted October 17, 2011 Posted October 17, 2011 Do you have an example of the picture you're wanting to compare? Perhaps a live area? Honestly, a 12x27 area is only used for one of two things, though... and to me ... what you're asking for smells like an anti-captcha script. Lofting the cyberwinds on teknoleather wings, I am...The Blue Drache
joystickus Posted October 17, 2011 Author Posted October 17, 2011 2Zedna Unfortunately I didn't manage to find anything like this in the forum. There are examples of comparing pictures pixel by pixel but I assumed that's not exactly what I need. I need it more simple -- to find out how to put binaries of the files into variables. 2Blue_Drache No, it's not anti-captcha. I want to use it as a trigger to making a click in two or more areas in the screen. Meaning if the picture in the given area is for example a green circle then click in the area one, if it's not then click in the area two.
joystickus Posted October 18, 2011 Author Posted October 18, 2011 (edited) Update: I found half a solution -- comparing an MD5 sum. For my templates they're all unique and they do match nicely to the MD5's of screenshots. Only now I don't understand why in the script it doesn't work. If _IdenticalImages("2c.bmp","2d.bmp") Then MsgBox(64,"Info","Match") Else MsgBox(64,"Info","Don't match") EndIf Func _IdenticalImages($file1,$file2) If _MD5ForFile($file1) = _MD5ForFile($file2) Then Return True Else Return False EndIf EndFunc And it gives an error message: Line 8 If _MD5ForFile($file1) = _MD5ForFile($file2) Then If ^ ERROR Error: Unknown function name. Edited October 18, 2011 by joystickus
guinness Posted October 18, 2011 Posted October 18, 2011 (edited) Of course it would where is the function _MD5ForFile? Is this your own function or trancexx's? I would advise to read the Help file about Functions before you continue, because it will help you for the future. Edited October 18, 2011 by guinness UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018
joystickus Posted October 18, 2011 Author Posted October 18, 2011 Got it! Thanks to everyone for help and remarks! The solution was in the part I missed: expandcollapse popupFunc _MD5ForFile($sFile) Local $a_hCall = DllCall("kernel32.dll", "hwnd", "CreateFileW", _ "wstr", $sFile, _ "dword", 0x80000000, _ ; GENERIC_READ "dword", 1, _ ; FILE_SHARE_READ "ptr", 0, _ "dword", 3, _ ; OPEN_EXISTING "dword", 0, _ ; SECURITY_ANONYMOUS "ptr", 0) If @error Or $a_hCall[0] = -1 Then Return SetError(1, 0, "") EndIf Local $hFile = $a_hCall[0] $a_hCall = DllCall("kernel32.dll", "ptr", "CreateFileMappingW", _ "hwnd", $hFile, _ "dword", 0, _ ; default security descriptor "dword", 2, _ ; PAGE_READONLY "dword", 0, _ "dword", 0, _ "ptr", 0) If @error Or Not $a_hCall[0] Then DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile) Return SetError(2, 0, "") EndIf DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFile) Local $hFileMappingObject = $a_hCall[0] $a_hCall = DllCall("kernel32.dll", "ptr", "MapViewOfFile", _ "hwnd", $hFileMappingObject, _ "dword", 4, _ ; FILE_MAP_READ "dword", 0, _ "dword", 0, _ "dword", 0) If @error Or Not $a_hCall[0] Then DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject) Return SetError(3, 0, "") EndIf Local $pFile = $a_hCall[0] Local $iBufferSize = FileGetSize($sFile) Local $tMD5_CTX = DllStructCreate("dword i[2];" & _ "dword buf[4];" & _ "ubyte in[64];" & _ "ubyte digest[16]") DllCall("advapi32.dll", "none", "MD5Init", "ptr", DllStructGetPtr($tMD5_CTX)) If @error Then DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile) DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject) Return SetError(4, 0, "") EndIf DllCall("advapi32.dll", "none", "MD5Update", _ "ptr", DllStructGetPtr($tMD5_CTX), _ "ptr", $pFile, _ "dword", $iBufferSize) If @error Then DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile) DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject) Return SetError(5, 0, "") EndIf DllCall("advapi32.dll", "none", "MD5Final", "ptr", DllStructGetPtr($tMD5_CTX)) If @error Then DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile) DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject) Return SetError(6, 0, "") EndIf DllCall("kernel32.dll", "int", "UnmapViewOfFile", "ptr", $pFile) DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $hFileMappingObject) Local $sMD5 = Hex(DllStructGetData($tMD5_CTX, "digest")) Return SetError(0, 0, $sMD5) EndFunc ;==>_MD5ForFile I didn't understand a single word in it, but once called it does what's needed.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now