Earthgas Posted October 5, 2010 Posted October 5, 2010 i think this will make GUI window to full screen mode but i need that when i open it it would dissable everithing that is out side of GUI and search,and do things only in GUI forgetting about rest of desktop i fail at explaining kcvinu 1
rapot Posted November 12, 2010 Posted November 12, 2010 #include-once; ------------------------------------------------------------------------------;; AutoIt Version: 3.0; Language: English; Description: Functions that assist with Image Search; Require that the ImageSearchDLL.dll be loadable;; ------------------------------------------------------------------------------;===============================================================================;; Description: Find the position of an image on the desktop; Syntax: _ImageSearchArea, _ImageSearch; Parameter(s): ; $findImage - the image to locate on the desktop; $tolerance - 0 for no tolerance (0-255). Needed when colors of ; image differ from desktop. e.g GIF; $resultPosition - Set where the returned x,y location of the image is.; 1 for centre of image, 0 for top left of image; $x $y - Return the x and y location of the image; $transparency - TRANSBLACK, TRANSWHITE or hex value (e.g. 0xffffff) of; the color to be used as transparency; can be omitted if; not needed;; Return Value(s): On Success - Returns 1; On Failure - Returns 0 ;; Note: Use _ImageSearch to search the entire desktop, _ImageSearchArea to specify; a desktop region to search;;===============================================================================Func _ImageSearch($findImage,$resultPosition,ByRef $x, ByRef $y,$tolerance,$transparency=0) return _ImageSearchArea($findImage,$resultPosition,0,0,@DesktopWidth,@DesktopHeight,$x,$y,$tolerance,$transparency)EndFuncFunc _ImageSearchArea($findImage,$resultPosition,$x1,$y1,$right,$bottom,ByRef $x, ByRef $y, $tolerance, $transparency=0) ;MsgBox(0,"asd","" & $x1 & " " & $y1 & " " & $right & " " & $bottom) if not ($transparency = 0) then $findImage = "*" & $transparency & " " & $findImage if $tolerance>0 then $findImage = "*" & $tolerance & " " & $findImage $result = DllCall("ImageSearchDLL.dll","str","ImageSearch","int",$x1,"int",$y1,"int",$right,"int",$bottom,"str",$findImage) ; If error exit if $result[0]="0" then return 0 ; Otherwise get the x,y location of the match and the size of the image to ; compute the centre of search $array = StringSplit($result[0],"|") $x=Int(Number($array[2])) $y=Int(Number($array[3])) if $resultPosition=1 then $x=$x + Int(Number($array[4])/2) $y=$y + Int(Number($array[5])/2) endif return 1EndFunc;===============================================================================;; Description: Wait for a specified number of seconds for an image to appear; ; Syntax: _WaitForImageSearch, _WaitForImagesSearch; Parameter(s): ; $waitSecs - seconds to try and find the image; $findImage - the image to locate on the desktop; $tolerance - 0 for no tolerance (0-255). Needed when colors of ; image differ from desktop. e.g GIF; $resultPosition - Set where the returned x,y location of the image is.; 1 for centre of image, 0 for top left of image; $x $y - Return the x and y location of the image; $transparency - TRANSBLACK, TRANSWHITE or hex value (e.g. 0xffffff) of; the color to be used as transparency can be omitted if; not needed;; Return Value(s): On Success - Returns 1; On Failure - Returns 0 ;;;===============================================================================Func _WaitForImageSearch($findImage,$waitSecs,$resultPosition,ByRef $x, ByRef $y,$tolerance,$transparency=0) $waitSecs = $waitSecs * 1000 $startTime=TimerInit() While TimerDiff($startTime) < $waitSecs sleep(100) $result=_ImageSearch($findImage,$resultPosition,$x, $y,$tolerance,$transparency) if $result > 0 Then return 1 EndIf WEnd return 0EndFunc;===============================================================================;; Description: Wait for a specified number of seconds for any of a set of; images to appear; ; Syntax: _WaitForImagesSearch; Parameter(s): ; $waitSecs - seconds to try and find the image; $findImage - the ARRAY of images to locate on the desktop; - ARRAY[0] is set to the number of images to loop through; ARRAY[1] is the first image; $tolerance - 0 for no tolerance (0-255). Needed when colors of ; image differ from desktop. e.g GIF; $resultPosition - Set where the returned x,y location of the image is.; 1 for centre of image, 0 for top left of image; $x $y - Return the x and y location of the image; $transparent - TRANSBLACK, TRANSWHITE or hex value (e.g. 0xffffff) of; the color to be used as transparent; can be omitted if; not needed;; Return Value(s): On Success - Returns the index of the successful find; On Failure - Returns 0 ;;;===============================================================================Func _WaitForImagesSearch($findImage,$waitSecs,$resultPosition,ByRef $x, ByRef $y,$tolerance,$transparency=0) $waitSecs = $waitSecs * 1000 $startTime=TimerInit() While TimerDiff($startTime) < $waitSecs for $i = 1 to $findImage[0] sleep(100) $result=_ImageSearch($findImage[$i],$resultPosition,$x, $y,$tolerance,$transparency) if $result > 0 Then return $i EndIf Next WEnd return 0EndFunc; find recycle bin if it is in the top left corner of screen; change 2nd argument to 0 to return the top left coord instead$result = _ImageSearchArea("recycle.bmp",1,0,0,200,200,$x1,$y1,0,0x000000) ;perfect black used as transparencyif $result=1 Then MouseMove($x1,$y1,3) MsgBox(0,"Found","Found a recycle bin with stuff in top left corner")EndIfline:$result = _ImageSearchArea("recycle.bmp",1,0,0,200,200,$x1,$y1,0,0x000000) ;perfect black used as transparencywhy it not found "recycle.bmp" (this bmp file have some transparency 0x000000)someone tell me about transparency parameter?recycle.bmp kcvinu 1
pezo89 Posted November 22, 2010 Posted November 22, 2010 ; If error exit if IsArray($result) Then;heres the workaround.. if $result[0]="0" then return 0 Else if $result="0" then return 0 EndIf Fixed my issue with Win7 64bit. Thx alot. it works now! riceking and kcvinu 2
Memories Posted December 20, 2010 Posted December 20, 2010 Hi, nice project! And my first question on this forum. There are some identical images on the screen. _ImageSearchArea returns the coordinates of 1st image it recognizes. Is it possible to get array with all the coordinates of identical images (without dll recompiling if possible ^) )? kcvinu 1
Zedna Posted December 20, 2010 Posted December 20, 2010 Hi, nice project!And my first question on this forum. There are some identical images on the screen. _ImageSearchArea returns the coordinates of 1st image it recognizes. Is it possible to get array with all the coordinates of identical images (without dll recompiling if possible ^) )?You can make UDF wrapper which will call this search function from DLL in a loop.Everytime it find something you must add found coordinates to output array and shrink search area accordingly. kcvinu 1 Resources UDF Â ResourcesEx UDF Â AutoIt Forum Search
Sven Posted February 4, 2011 Posted February 4, 2011 (edited) I've written the following to use it in my projects and figured you guys might find it useful, too: expandcollapse popup; #FUNCTION# ======================================================================================================================================================================================================================================================= ; Name...........: _Wait_For() ; ; Description ...: Waits for images, symbols or other graphics to be or to not be on the screen according to user definition ; This can be done by utilizing three different methods: ; ; Method 1 ...: ; ; Syntax ........: _Wait_For($file, $left, $top , $right, $bottom, $duration, $not, $any_or_all) ; ; Parameters ....: $file - name of the file holding the template ; $left - left coordinate of search rectangle ; $top - top coordinate of search rectangle ; $right - right coordinate of search rectangle ; $bottom - bottom coordinate of search rectangle ; $duration - the duration for the timeout in milliseconds ; $not - "not" or anything else; waits for an object to "not" be present in the search rectangle or to (anything else) be present in the search rectangle ; $any_or_all - can be omitted because it's irrelevant when searching for only one object ; ; Return values .: Success - returns 1 if the object was found; this is what you'd want if you go with $not = 0 ; - returns -1 if the object was not found; this is what you'd want if you go with $not = "not" ; ; Examples ......: $result = _Wait_For("recycle_bin", 0, 0, 100, @DesktopHeight, 10000, 0); waits for the template in "recycle_bin" to appear within the specified rectangle during a 10 second timeout ; $result = _Wait_For("recycle_bin", 0, 0, 100, @DesktopHeight, 20000, 1); waits for the template in "recycle_bin" to NOT appear within the specified rectangle during a 20 second timeout ; ; Failure - returns 0 if the function timed out ; ; ; ; Method 2 ...: ; ; Syntax.........: _Wait_For("file 1, ..., file n", $top , $left, $bottom, $right, $duration, $not, $all) ; ; Parameters ....: $file - name of the files holding the templates ; $left - left coordinate of search rectangle ; $top - top coordinate of search rectangle ; $right - right coordinate of search rectangle ; $bottom - bottom coordinate of search rectangle ; $duration - the duration for the timeout in milliseconds ; $not - "not" or anything else; waits for the objects to "not" be present in the search rectangle or to (anything else) be present in the search rectangle ; $any_or_all - "any" or "all"; specifies whether to wait for "all" the objects on the screen to be gone or present, or "any" of the objects to be gone or present ; ; Return values .: Success - returns 1 if the object was found; this is what you'd want if you go with $not = 0 ; - returns -1 if the object was not found; this is what you'd want if you go with $not = "not" ; ; Examples ......: $result = _Wait_For("recycle_bin, control_panel", 0, 0, 100, @DesktopHeight, 10000, 0, "any"); waits for the templates in "recycle_bin" OR "control_panel" to appear within the specified rectangle during a 10 second timeout ; $result = _Wait_For("recycle_bin, control_panel", 0, 0, 100, @DesktopHeight, 20000, 0, "all"); waits for the templates in "recycle_bin" AND "control_panel" to appear within the specified rectangle during a 20 second timeout ; $result = _Wait_For("recycle_bin, control_panel", 0, 0, 100, @DesktopHeight, 30000, 1, "any"); waits for the templates in "recycle_bin" OR "control_panel" to NOT appear within the specified rectangle during a 30 second timeout ; $result = _Wait_For("recycle_bin, control_panel", 0, 0, 100, @DesktopHeight, 40000, 1, "all"); waits for the templates in "recycle_bin" AND "control_panel" to NOT appear within the specified rectangle during a 40 second timeout ; ; Failure - returns 0 if the function timed out ; ; ; ; Method 3 ...: ; ; Syntax.........: Dim $aFiles[n][10] = [[$file 1, $top, $left, $bottom, $right, $transparency, $shade_variation, $runs, $behavior, $not], _ ; [ ... , $top, $left, $bottom, $right, $transparency, $shade_variation, $runs, $behavior, $not], _ ; [$file n, $top, $left, $bottom, $right, $transparency, $shade_variation, $runs, $behavior, $not]] ; $result = _Wait_For($aFiles, $duration, $any_or_all) ; ; Parameters ....: $aFiles - an array of file names of .BMP files containing the templates to look for ; $file = name of the file holding the template ; $left = left coordinate of search rectangle ; $top = top coordinate of search rectangle ; $right = right coordinate of search rectangle ; $bottom = bottom coordinate of search rectangle ; $transparency = "TRANSBLACK" or "TRANSWHITE", including the '"'; for hex values, use e.g. "TRANS00FF00" ; $shade_variation = a number between 0 and 255 to indicate the allowed number of shades of variation of the red, green, and blue components of the object ; $runs = how often the template should be looked for until a result is returned; depends on $behavior ; $behavior = 0: exit on any find ; 1: exit on first positive find ; 2: exit after $runs consecutive finds ; $not = "not" or anything else; waits for the objects to "not" be present in the search rectangle or to (anything else) be present in the search rectangle ; ; $duration - the duration for the timeout in milliseconds ; $any_or_all - "any" or "all"; specifies whether to wait for "all" the objects on the screen to be gone or present, or "any" of the objects to be gone or present ; ; Examples ......: Dim $aFiles[2][10] = [["recycle_bin", 0, 0, 200, 200, "transblack", 10, 3, 1, "0", "all"], _ ; requires "recycle_bin" to be present for the function to report success ; ["control_panel", 800, 600, 1024, 768, "transblack", 10, 3, 1, "not", "all"]] ; requires "control_panel" to not be present for the function to report success ; $result = _Wait_For($aFiles, 30000, "all") ; ; Return values .: Success - returns the input array expanded by 5 result columns ; $result[n][0] = name of the file holding the template ; $result[n][1] = left coordinate of search rectangle ; $result[n][2] = top coordinate of search rectangle ; $result[n][3] = right coordinate of search rectangle ; $result[n][4] = bottom coordinate of search rectangle ; $result[n][5] = "TRANSBLACK" or "TRANSWHITE", including the '"'; for hex values, use e.g. "TRANS00FF00" ; $result[n][6] = a number between 0 and 255 to indicate the allowed number of shades of variation of the red, green, and blue components of the object ; $result[n][7] = how often the template should be looked for until a result is returned; depends on $behavior ; $result[n][8] = behavior used ; $result[n][9] = "not" or not ;) ; $result[n][10] = 1 if template was found ; 0 if template was not found ; $result[n][11] = 0 if template was not found ; leftmost coordinate of the template if template was found ; $result[n][12] = 0 if template was not found ; topmost coordinate of the template if template was found ; $result[n][13] = 0 if template was not found ; x axis center of the template if template was found ; $result[n][14] = 0 if template was not found ; y axis center of the template if template was found ; ; Failure - returns 0 if the function timed out ; ; Author ........: Sven ; Dependencies...: _Imagesearch(); imagesearchdll.dll ; ================================================================================================================================================================================================================================================================== This one makes use of my _Imagesearch() interpretation from one or two pages ago, so be sure to stick those two together. Also note that that _Imagesearch() function adds .bmp to the file name passed to it and looks for that in the \pics\ subdirectory of where it's saved to, so you might want to change that part of the _Imagesearch() function to fit your needs. _Wait_For() worked with the examples shown in the description. I'll run it through more thorough tests today or tomorrow. Any feedback is greatly appreciated. History: - added $any_or_all for array mode. Why I didn't put this in initially is beyond me... senility perhaps _wait_for.zip Edited February 4, 2011 by Sven
Ryuho Posted February 5, 2011 Posted February 5, 2011 (edited) I downloaded ImageSearch zip (which includes .au3 file, ImageSearchDLL.dll and demo.au3) and ran the demo and it gave me an error saying: imagesearch\ImageSearch.au3 (40) : ==> Subscript used with non-Array variable.: The code in question is: if $result[0]="0" then return 0 So I replaced it with: ; If error exit If @error Then Return 0 EndIf This is the correct fix right? Well the problem is that I can't get anything to return anything but error, the DllCall never succeeds in finding anything. Is there anything I'm doing wrong? I tried a few files with different file formats and different small portion of the screenshot and nothing seems to work. I even tried a file that's all white and ran it while displaying blank web browser that has the same hex color white, no dice. Edited February 5, 2011 by Ryuho
Sven Posted February 5, 2011 Posted February 5, 2011 (edited) You'd want to check if the value returned is an array. if isarray($result) then ... Edited February 5, 2011 by Sven
Ryuho Posted February 5, 2011 Posted February 5, 2011 Thanks for the response but "Then...", then what? I tried what you mentioned and the isarray method came back false. it's not an array. Either way if it throws an @error there is something wrong, don't you think? I'm going to try calling the method directory: $result = DllCall("ImageSearchDLL.dll","str","ImageSearch","int",$x1,"int",$y1,"int",$right,"int",$bottom,"str",$findImage) See where that takes me...
Sven Posted February 5, 2011 Posted February 5, 2011 (edited) The point is you can only access a variable like an array if it really is an array. If it's just a string, you get the error you mentioned. To make sure the function proceeds only if the returned value is an array, you need to use "if isarray()". If It's an array, then start doing whatever you want. Without "if isarray()", if it's not an array, you get the error you mentioned, meaning that Imagesearch probably couldn't find what it was looking for. #include <array.au3> $result = DllCall("ImageSearchDLL.dll", "str", "ImageSearch", "int", $x1, "int", $y1, "int", $right, "int", $bottom, "str", $findImage) If IsArray($result) Then _ArrayDisplay($result) Else MsgBox(0, "imagesearch returned: " & $result) EndIf Edited February 5, 2011 by Sven
Ryuho Posted February 5, 2011 Posted February 5, 2011 Yeah, I gathered that... it's suppose to return the x,y of the found pattern. My real question is, why isn't it working, is there a common reason why this module fails to work that I missed while googling. Sorry if I wasn't clear initially.
Sven Posted February 5, 2011 Posted February 5, 2011 (edited) I don't really have an idea, sorry. Works like a charm for me. Made you an example. Open the picture file included in the archive with an image viewer that allows for 1:1 viewing (I was using IrfanView), and place it so it isn't covered by any other window. Then run test.au3. You may want to replace the line $findimage = "user_green.bmp" with $file = "user_green.bmp" $findimage = "*" & "transblack" & " " & "*" & 30 & " " & $file to get the transparency of the image recognised by the imagesearchdll.dll. This is to make it work with image displaying programs (like most webbrowsers) that handle transparency properly.test imagesearch.zip Edited February 5, 2011 by Sven
AdmiralAlkex Posted February 5, 2011 Posted February 5, 2011 @SvenRyuho is probably running in x64.@RyuhoAdd:#AutoIt3Wrapper_UseX64=nto use x86 AutoIt.Remember to install SciTE4AutoIt3 if you haven't. .Some of my scripts: ShiftER, Codec-Control, Resolution switcher for HTC ShiftSome of my UDFs: SDL UDF, SetDefaultDllDirectories, Converting GDI+ Bitmap/Image to SDL Surface
Ryuho Posted February 6, 2011 Posted February 6, 2011 Oh man thanks to both of you I got it working. I had to put the x64 tag like AdmiralAlkex said and Sven's script worked beautifully.
logmein Posted February 6, 2011 Posted February 6, 2011 Hmm, first post's link is died. [font=arial, helvetica, sans-serif][s]Total USB Security 3.0 Beta[/s] | [s]Malware Kill[/s] | Malware Scanner | Screen Hider | Locker | Matrix Generator[s]AUTO-SYNC 1.0 | MD5 Hash Generator | URL Checker | Tube Take [/s]| Random Text[/font]
jvanegmond Posted February 6, 2011 Posted February 6, 2011 Hmm, first post's link is died.This means what? You can't find the file? It's on the 3rd page: Same page you posted on. You realize it is broken and want to warn everyone else? Then you forgot to mention it is on the 3rd page. github.com/jvanegmond
blackmage999 Posted February 25, 2011 Posted February 25, 2011 This means what? You can't find the file? It's on the 3rd page: Same page you posted on. You realize it is broken and want to warn everyone else? Then you forgot to mention it is on the 3rd page.you mean page 4 (posts 63 and 64)
jvanegmond Posted February 28, 2011 Posted February 28, 2011 you mean page 4 (posts 63 and 64)Actually, your post made me realize that there is a setting that determines the number of posts on each page. For me, the thread has only 3 pages and you mention a page 4. 8)Better is indeed to link to posts: github.com/jvanegmond
AnildasTVM Posted March 7, 2011 Posted March 7, 2011 Hai link for downloading dll is not getting. Can any body help
tbodine88 Posted March 10, 2011 Posted March 10, 2011 I have modified The image search wrapper so the error is shown. Func _ImageSearchArea($findImage, $resultPosition, $x1, $y1, $right, $bottom, ByRef $x, ByRef $y, $tolerance, $transparency = 0) ;MsgBox(0,"asd","" & $x1 & " " & $y1 & " " & $right & " " & $bottom) If not ($transparency = 0) Then $findImage = "*" & $transparency & " " & $findImage If $tolerance > 0 Then $findImage = "*" & $tolerance & " " & $findImage MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & 'Before Call' ) ;### Debug MSGBOX Local $result = DllCall("ImageSearchDLL.dll", "str", "ImageSearch", "int", $x1, "int", $y1, "int", $right, "int", $bottom, "str", $findImage) Local $err = @error MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & 'After Call' ) ;### Debug MSGBOX if $err > 0 Then MsgBox(262144,'Debug line ~' & @ScriptLineNumber,'Selection:' & @lf & '$err' & @lf & @lf & 'Return:' & @lf & $err) ;### Debug MSGBOX return 0 EndIf ; If error exit If $result[0] = "0" Then Return 0 EndIf Regardless of which DLL I use, I always get the @error=1 "unable to use the DLL file" I am running under Windows 7. I am using Auto-IT with out the 64 bit features. My goal is to find buttons to click on an any application. Especially those where control click will not work, since AutoIt Window Info shows nothing for the control name. In this particular instance I what to control Fraps. Thanks in advance ImageSearch_hacked.au3
Recommended Posts