Jump to content

1 Screenshot

About This File

ImageSearch UDF v3.5 - AutoIt Wrapper for ImageSearchDLL

Advanced image search library for AutoIt with cache system and SIMD optimization.

Overview

ImageSearchDLL UDF is a high-performance image search library for AutoIt that enables you to find images on screen or within other images. Built with C++14 and optimized with SIMD instructions (AVX512/AVX2/SSE2), it provides fast and accurate image matching capabilities.

Features

  • High Performance: SIMD optimization (AVX512/AVX2/SSE2) for fast searching
  • Multi-Monitor Support: Full support for multi-monitor setups with negative coordinates
  • DPI Awareness: Thread-local DPI awareness without affecting AutoIt GUI
  • Cache System: Persistent cache for 30-50% speed boost on repeated searches
  • Image Scaling: Search for images at different scales (0.1x to 5.0x)
  • Screen Capture: Direct screen capture with DPI-aware coordinates
  • Mouse Automation: Precise mouse movement and clicking with multi-monitor support

Requirements

  • AutoIt: Version 3.3.16.1 or higher
  • Windows: XP SP3 to Windows 11
  • Architecture: x86 or x64 (automatic detection)
  • DLL: ImageSearchDLL v3.5 (included)

Installation

  1. Download the UDF package

  2. Place ImageSearchDLL_UDF.au3 in your script directory

  3. Ensure the appropriate DLL is in the same directory:

    • ImageSearchDLL_x64.dll for 64-bit AutoIt
    • ImageSearchDLL_x86.dll for 32-bit AutoIt
    • Not required in embedded version! (But need to install Visual C++ Redistributable 2015-2022)
  4. Include the UDF in your script:

#include "ImageSearchDLL_UDF.au3"

Quick Start

Basic Image Search

#include "ImageSearchDLL_UDF.au3"

; Search for a button on screen
Local $aResult = _ImageSearch("button.png")
If $aResult[0] > 0 Then
    ConsoleWrite("Found at: " & $aResult[1][0] & ", " & $aResult[1][1] & @CRLF)
    MouseClick("left", $aResult[1][0], $aResult[1][1])
Else
    ConsoleWrite("Image not found" & @CRLF)
EndIf

Wait for Image and Click

; Wait up to 5 seconds for button to appear, then click it
If _ImageSearch_WaitClick(5000, "button.png") Then
    MsgBox(0, "Success", "Button clicked!")
Else
    MsgBox(0, "Failed", "Button not found within 5 seconds")
EndIf

Screen Capture

; Capture a region and save as PNG
_ImageSearch_ScreenCapture_SaveImage(@ScriptDir & "\screenshot.png", 100, 100, 600, 400)

; Capture full screen
_ImageSearch_ScreenCapture_SaveImage(@ScriptDir & "\fullscreen.png")

API Reference

Startup & Configuration

_ImageSearch_Startup()

Initializes the ImageSearch library by loading the appropriate DLL.

Returns:

  • Success: 1 (DLL loaded successfully)
  • Failure: 0 and sets @error

Remarks:

  • Must be called before using any search functions
  • Automatically called on script start
  • DLL v3.5+ uses thread-local DPI awareness and won't affect AutoIt GUI

 

_ImageSearch_Shutdown()

Closes the DLL and cleans up resources.

 

_ImageSearch_SetDllPath($sPath)

Sets a custom DLL path (must be called before _ImageSearch_Startup).

Parameters:

  • $sPath - Full path to the DLL file

Returns:

  • Success: 1
  • Failure: 0 (file not found)

 

Core Search Functions

_ImageSearch($sImagePath [, $iLeft, $iTop, $iRight, $iBottom [, $iScreen [, $iTolerance [, $iResults [, $iCenterPOS [, $fMinScale [, $fMaxScale [, $fScaleStep [, $iReturnDebug [, $iUseCache]]]]]]]])

Searches for an image within a specified screen area.

Parameters:

  • $sImagePath - Image file path(s), multiple separated by "|"
  • $iLeft, $iTop, $iRight, $iBottom - Search region (0 = entire screen)
  • $iScreen - Monitor index (-1 = virtual screen, 0 = primary, 1+ = specific monitor)
  • $iTolerance - Color tolerance 0-255 (default: 10)
  • $iResults - Max results 1-1024 (default: 1)
  • $iCenterPOS - Return center (1) or top-left (0) coordinates (default: 1)
  • $fMinScale, $fMaxScale - Scale range 0.1-5.0 (default: 1.0)
  • $fScaleStep - Scale step (default: 0.1)
  • $iReturnDebug - Debug mode (default: 0)
  • $iUseCache - Enable cache (default: 1)

Returns:

  • Success: Array of found positions [count][X, Y, Width, Height]
  • Failure: Empty array with @error set

Example:

; Search for multiple images with scaling
Local $aResult = _ImageSearch("icon1.png|icon2.png", 0, 0, 800, 600, -1, 10, 5, 1, 0.8, 1.2, 0.1)
If $aResult[0] > 0 Then
    For $i = 1 To $aResult[0]
        ConsoleWrite("Match " & $i & " at: " & $aResult[$i][0] & ", " & $aResult[$i][1] & @CRLF)
    Next
EndIf

 

_ImageSearch_InImage($sSourceImage, $sTargetImage [, $iTolerance [, $iResults [, $iCenterPOS [, $fMinScale [, $fMaxScale [, $fScaleStep [, $iReturnDebug [, $iUseCache]]]]]]]])

Searches for a target image within a source image (file-to-file search).

Parameters:

  • $sSourceImage - Path to source image file
  • $sTargetImage - Path to target image file(s), multiple separated by "|"
  • Other parameters same as _ImageSearch

Returns: Same as _ImageSearch

Remarks: Useful for pre-processing images or testing without screen capture

Example:

$aResult = _ImageSearch_InImage("screenshot.png", "button.png", 20)

 

_ImageSearch_hBitmap($hBitmapSource, $hBitmapTarget [, $iTolerance [, $iLeft [, $iTop [, $iRight [, $iBottom [, $iResults [, $iCenterPOS [, $fMinScale [, $fMaxScale [, $fScaleStep [, $iReturnDebug [, $iUseCache]]]]]]]]]]]])

Searches for a target bitmap within a source bitmap (memory-to-memory search).

Parameters:

  • $hBitmapSource - Handle to source bitmap (HBITMAP)
  • $hBitmapTarget - Handle to target bitmap (HBITMAP)
  • Other parameters same as _ImageSearch

Returns: Same as _ImageSearch

Remarks:

  • Fastest method for repeated searches (no disk I/O)
  • Bitmaps must be created with GDI/GDI+ functions

 

Screen Capture Functions

_ImageSearch_CaptureScreen([$iLeft, $iTop, $iRight, $iBottom [, $iScreen]])

Capture screen region and return as HBITMAP handle.

Parameters:

  • $iLeft, $iTop, $iRight, $iBottom - Capture region (default: 0 = full screen)
  • $iScreen - Monitor index (default: -1 = virtual screen)

Returns:

  • Success: HBITMAP handle (must DeleteObject when done)
  • Failure: 0 and sets @error

Example:

$hBitmap = _ImageSearch_CaptureScreen(0, 0, 800, 600)
; ... use $hBitmap ...
_WinAPI_DeleteObject($hBitmap)

 

_ImageSearch_ScreenCapture_SaveImage($sImageFile [, $iLeft [, $iTop [, $iRight [, $iBottom [, $iScreen]]]]])

Captures a screen region and saves it directly to an image file in one call.

Parameters:

  • $sImageFile - Output file path (extension determines format: .bmp, .png, .jpg/.jpeg)
  • $iLeft, $iTop, $iRight, $iBottom - Capture region (default: 0 = full screen)
  • $iScreen - Monitor index (default: 0 = primary screen)

Returns:

  • Success: True (1)
  • Failure: False (0) and sets @error

Remarks:

  • Automatically detects format from file extension
  • ~2x faster than separate capture + save operations
  • JPEG quality is fixed at 100% (highest quality)
  • Uses DPI-aware capture (accurate on all DPI scales)

Example:

; Capture full primary screen to PNG
_ImageSearch_ScreenCapture_SaveImage(@ScriptDir & "\screenshot.png")

; Capture region on monitor 2 to JPEG
_ImageSearch_ScreenCapture_SaveImage(@ScriptDir & "\region.jpg", 100, 100, 600, 400, 2)

 

_ImageSearch_hBitmapLoad($sImageFile [, $iAlpha [, $iRed [, $iGreen [, $iBlue]]]])

Load image file and convert to HBITMAP handle.

Parameters:

  • $sImageFile - Path to image file
  • $iAlpha, $iRed, $iGreen, $iBlue - Background color components 0-255 (default: 0 = transparent)

Returns:

  • Success: HBITMAP handle (must DeleteObject when done)
  • Failure: 0 and sets @error

Example:

$hBitmap = _ImageSearch_hBitmapLoad("image.png", 255, 255, 255, 255) ; White background
; ... use $hBitmap ...
_WinAPI_DeleteObject($hBitmap)

 

Mouse Functions

_ImageSearch_MouseMove($iX, $iY [, $iSpeed [, $iScreen]])

Moves mouse cursor to coordinates (supports negative coordinates on multi-monitor).

Parameters:

  • $iX, $iY - Target coordinates (-1 = keep current position)
  • $iSpeed - Speed 0-100 (0=instant, default: 0)
  • $iScreen - Monitor index (default: -1 = virtual screen)

Returns: 1 on success, 0 on failure

 

_ImageSearch_MouseClick([$sButton [, $iX [, $iY [, $iClicks [, $iSpeed [, $iScreen]]]]]])

Clicks mouse at coordinates (screen or current position).

Parameters:

  • $sButton - Button: "left", "right", "middle" (default: "left")
  • $iX, $iY - Coordinates (-1 = current position)
  • $iClicks - Number of clicks (default: 1)
  • $iSpeed - Speed 0-100 (0=instant, default: 0)
  • $iScreen - Monitor index (default: -1 = virtual screen)

Returns: 1 on success, 0 on failure

 

_ImageSearch_MouseClickWin($sTitle, $sText, $iX, $iY [, $sButton [, $iClicks [, $iSpeed]]])

Clicks mouse in a window.

Parameters:

  • $sTitle - Window title/class/handle
  • $sText - Window text
  • $iX, $iY - Relative coordinates in window
  • $sButton - Button (default: "left")
  • $iClicks - Number of clicks (default: 1)
  • $iSpeed - Speed 0-100 (default: 0)

Returns: 1 on success, 0 on failure

 

Wait & Click Functions

_ImageSearch_Wait($iTimeout, $sImagePath [, $iLeft [, $iTop [, $iRight [, $iBottom [, $iScreen [, $iTolerance [, $iResults [, $iCenterPOS [, $fMinScale [, $fMaxScale [, $fScaleStep [, $iReturnDebug [, $iUseCache [, $iMaxAttempts]]]]]]]]]]]]])

Waits for an image to appear on screen with timeout and optional max attempts limit.

Parameters:

  • $iTimeout - Timeout in milliseconds (0 = wait forever)
  • $sImagePath - Image file path(s), multiple separated by "|"
  • $iMaxAttempts - Max number of search attempts (0 = unlimited, default: 0)
  • Other parameters same as _ImageSearch

Returns:

  • Success: 2D Array (same as _ImageSearch)
  • Timeout: Empty array with [0][0] = 0

Example:

; Wait 5 seconds for button (unlimited attempts)
$aResult = _ImageSearch_Wait(5000, "button.png")
If $aResult[0] > 0 Then
    MouseClick("left", $aResult[1][0], $aResult[1][1])
Else
    MsgBox(0, "Timeout", "Button not found")
EndIf

 

_ImageSearch_WaitClick($iTimeout, $sImagePath [, $sButton [, $iClicks [, $iLeft [, $iTop [, $iRight [, $iBottom [, $iScreen [, $iTolerance [, $iResults [, $iCenterPOS [, $fMinScale [, $fMaxScale [, $fScaleStep [, $iReturnDebug [, $iUseCache]]]]]]]]]]]]])

Waits for an image and clicks it when found.

Parameters:

  • $iTimeout - Timeout in milliseconds (0 = wait forever)
  • $sImagePath - Image file path(s)
  • $sButton - Mouse button: "left", "right", "middle" (default: "left")
  • $iClicks - Number of clicks (default: 1)
  • Other parameters same as _ImageSearch

Returns:

  • Success: 1 (image found and clicked)
  • Timeout: 0 (image not found)

 

Monitor Functions

_ImageSearch_Monitor_GetList()

Gets a list of all connected display monitors and their properties.

Returns:

  • Success: The number of monitors found. @extended contains a detailed log.
  • Failure: 0 and sets @error

Remarks:

  • Populates the global $g_aMonitorList
  • Called automatically by _ImageSearch_Startup

 

_ImageSearch_Monitor_ToVirtual($iMonitor, $iX, $iY)

Converts local monitor coordinates to virtual screen coordinates.

Parameters:

  • $iMonitor - The 1-based index of the monitor
  • $iX, $iY - Coordinates relative to the monitor's top-left corner

Returns:

  • Success: A 2-element array [$vX, $vY] containing virtual screen coordinates
  • Failure: 0 and sets @error

 

_ImageSearch_Monitor_FromVirtual($iMonitor, $iX, $iY)

Converts virtual screen coordinates to local monitor coordinates.

Parameters:

  • $iMonitor - The 1-based index of the monitor
  • $iX, $iY - Virtual screen coordinates

Returns:

  • Success: A 2-element array [$lX, $lY] containing local monitor coordinates
  • Failure: 0 and sets @error

 

_ImageSearch_Monitor_Current()

Detects which monitor contains the current mouse cursor position.

Returns:

  • Success: Monitor index (1-based) where the cursor is located
  • Failure: 0 and sets @error

 

_ImageSearch_Monitor_GetAtPosition([$iX [, $iY]])

Returns detailed information string about the monitor at specified position.

Parameters:

  • $iX, $iY - Coordinates (default: -1 = use mouse cursor position)

Returns:

  • Success: String describing the monitor (e.g., "Monitor 2: 1920x1080 (Primary)")
  • Failure: Error message string

 

Window Coordinate Functions

_ImageSearch_Window_ToScreen($hWnd, $iX, $iY [, $bClientArea])

Converts window-relative coordinates to screen (virtual desktop) coordinates.

Parameters:

  • $hWnd - Window handle or title
  • $iX, $iY - Coordinates relative to window
  • $bClientArea - True = relative to client area, False = relative to window (default: True)

Returns:

  • Success: A 2-element array [$screenX, $screenY] containing screen coordinates
  • Failure: 0 and sets @error

 

_ImageSearch_Window_FromScreen($hWnd, $iScreenX, $iScreenY [, $bClientArea])

Converts screen (virtual desktop) coordinates to window-relative coordinates.

Parameters:

  • $hWnd - Window handle or title
  • $iScreenX, $iScreenY - Screen coordinates
  • $bClientArea - True = relative to client area, False = relative to window (default: True)

Returns:

  • Success: A 2-element array [$winX, $winY] containing window-relative coordinates
  • Failure: 0 and sets @error

 

Cache & Info Functions

_ImageSearch_WarmUpCache($sImagePaths [, $bEnableCache])

Pre-loads images into cache for faster subsequent searches.

Parameters:

  • $sImagePaths - Pipe-separated list of images to preload
  • $bEnableCache - Enable persistent cache (default: True)

Returns:

  • Success: Number of images cached
  • Failure: 0

Example:

_ImageSearch_WarmUpCache("btn1.png|btn2.png|icon.png")

 

_ImageSearch_ClearCache()

Clears the internal bitmap and location cache.

Remarks:

  • Useful for freeing memory or forcing re-scan after image updates
  • Clears both in-memory cache and persistent disk cache

 

_ImageSearch_GetDllInfo([$bForceRefresh])

Gets comprehensive DLL information in INI format.

Parameters:

  • $bForceRefresh - Force refresh of cached info (default: True)

Returns: Multi-line string in INI format with sections:

  • [DLL] - DLL name, version, architecture, author
  • [OS] - OS name, version, build, platform
  • [CPU] - Threads, SSE2, AVX2, AVX512 support
  • [SCREEN] - Virtual screen, scale, monitors with individual resolutions
  • [CACHE] - Location cache, bitmap cache, pool size

 

_ImageSearch_GetInfo()

Gets formatted DLL and system information for display.

Returns: Formatted string with DLL info, cache status, and screen information

 

_ImageSearch_GetDllValue($sSection, $sKey)

Quick accessor to read any value from cached DLL Info.

Parameters:

  • $sSection - Section name (DLL, OS, CPU, SCREEN, CACHE)
  • $sKey - Key name

Returns: Value string or "" if not found

Example:

$sVersion = _ImageSearch_GetDllValue("DLL", "Version")
$sOSName = _ImageSearch_GetDllValue("OS", "Name")
$iThreads = _ImageSearch_GetDllValue("CPU", "Threads")

 

_ImageSearch_GetLastResult()

Gets the raw DLL return string from the last search.

Returns: Raw result string (e.g., "{2}[100|200|32|32,150|250|32|32]")

Remarks: Useful for debugging or custom parsing

 

_ImageSearch_GetScale([$iScreen])

Gets the DPI scale factor for a specific monitor as a decimal number.

Parameters:

  • $iScreen - Monitor index (0 = Primary, 1+ = specific monitor number)

Returns: Scale factor as number (e.g., 1.0, 1.25, 1.5) or 0 if not found

Example:

$fScale = _ImageSearch_GetScale(0)  ; Get primary monitor scale (e.g., 1.25)
$fScale = _ImageSearch_GetScale(2)  ; Get monitor 2 scale

 

Examples

Advanced Search with Multiple Images and Scaling

#include "ImageSearchDLL_UDF.au3"

; Search for multiple UI elements with different scales
Local $sImages = "button_ok.png|button_cancel.png|icon_settings.png"
Local $aResult = _ImageSearch($sImages, 0, 0, 1920, 1080, -1, 15, 10, 1, 0.8, 1.3, 0.1, 0, 1)

If $aResult[0] > 0 Then
    ConsoleWrite("Found " & $aResult[0] & " matches:" & @CRLF)
    For $i = 1 To $aResult[0]
        ConsoleWrite("  Match " & $i & ": X=" & $aResult[$i][0] & ", Y=" & $aResult[$i][1] & 
                     ", W=" & $aResult[$i][2] & ", H=" & $aResult[$i][3] & @CRLF)
    Next
Else
    ConsoleWrite("No matches found" & @CRLF)
EndIf

Multi-Monitor Screen Capture

#include "ImageSearchDLL_UDF.au3"

; Get monitor information
_ImageSearch_Monitor_GetList()
ConsoleWrite("Detected " & $g_aMonitorList[0][0] & " monitors" & @CRLF)

; Capture each monitor separately
For $i = 1 To $g_aMonitorList[0][0]
    Local $sFile = @ScriptDir & "\monitor_" & $i & ".png"
    _ImageSearch_ScreenCapture_SaveImage($sFile, 0, 0, 0, 0, $i)
    ConsoleWrite("Captured monitor " & $i & " to: " & $sFile & @CRLF)
Next

; Capture entire virtual desktop
_ImageSearch_ScreenCapture_SaveImage(@ScriptDir & "\virtual_desktop.png", 0, 0, 0, 0, -1)

Automated UI Testing

#include "ImageSearchDLL_UDF.au3"

; Pre-load images for better performance
_ImageSearch_WarmUpCache("login_button.png|username_field.png|password_field.png")

; Wait for login screen and interact
If _ImageSearch_WaitClick(10000, "login_button.png") Then
    ConsoleWrite("Login button clicked" & @CRLF)
    
    ; Find username field and click
    Local $aUsername = _ImageSearch_Wait(5000, "username_field.png")
    If $aUsername[0] > 0 Then
        MouseClick("left", $aUsername[1][0], $aUsername[1][1])
        Send("myusername")
        
        ; Find password field and click
        Local $aPassword = _ImageSearch_Wait(5000, "password_field.png")
        If $aPassword[0] > 0 Then
            MouseClick("left", $aPassword[1][0], $aPassword[1][1])
            Send("mypassword")
            Send("{ENTER}")
        EndIf
    EndIf
Else
    MsgBox(0, "Error", "Login screen not found within 10 seconds")
EndIf

Error Codes

Code Constant Description
-1 $IMGSE_INVALID_PATH Invalid file path
-2 $IMGSE_FAILED_TO_LOAD_IMAGE Failed to load image
-3 $IMGSE_FAILED_TO_GET_SCREEN_DC Failed to get screen device context
-4 $IMGSE_INVALID_SEARCH_REGION Invalid search region
-5 $IMGSE_INVALID_PARAMETERS Invalid parameters
-6 $IMGSE_INVALID_SOURCE_BITMAP Invalid source bitmap
-7 $IMGSE_INVALID_TARGET_BITMAP Invalid target bitmap
-9 $IMGSE_RESULT_TOO_LARGE Result too large
-10 $IMGSE_INVALID_MONITOR Invalid monitor

Performance Tips

  1. Use Cache: Enable cache for repeated searches to get 30-50% speed boost
  2. Pre-load Images: Use _ImageSearch_WarmUpCache() during initialization
  3. Limit Search Area: Specify search regions instead of full screen when possible
  4. Optimize Tolerance: Use appropriate tolerance values (5-15 for most cases)
  5. Use Appropriate Scale Range: Limit scale range to what you actually need
  6. Monitor Selection: Use specific monitor index for faster searches on multi-monitor setups
  7. Image Format: BMP files load faster than PNG/JPG but are larger
  8. Memory Management: Always call _WinAPI_DeleteObject() for HBITMAP handles

Changelog

Version 3.5

  • Added thread-local DPI awareness (no GUI resize issues)
  • Enhanced multi-monitor support with individual monitor scales
  • Improved cache system with persistent disk cache
  • Added _ImageSearch_ScreenCapture_SaveImage() for direct file saving
  • Performance optimizations with SIMD instructions
  • Better error handling and debugging information

License

This project is licensed under the MIT License - see the LICENSE file for details.

Author

 Dao Van Trong - TRONG.PRO 


 Thank you for using ImageSearch UDF! 🚀  

 

Support My Work

Enjoy my work? Buy me a 🍻 or tip via ❤️ PayPal


Happy Automating! 🚀

___________________________

Edited by Trong
Update document!


What's New in Version v3.5

Released

Fix dll errors. DLL Only applying internal scaling will not affect AutoIT GUI!


User Feedback

Recommended Comments

Turranius

Posted (edited)

Works nicely. Never got it to work in vmware for some reason. Wrote my script on my own machine which worked fine. As soon as I try it on vmware workstation 15, I just get "! Dll not found or Call Dll error !".

I've verified the location of the dll. Also tried compiling as a x86 exe to try that dll. Strange. Guess it checks video memory or something which differs from a physical computer.

Adding a consolewrite on @error after the dllcall just gives me code 1, which according to dllcall help is

  1 = unable to use the DLL file,
Edited by Turranius
Trong

Posted

On 1/30/2020 at 1:29 AM, Turranius said:

Works nicely. Never got it to work in vmware for some reason. Wrote my script on my own machine which worked fine. As soon as I try it on vmware workstation 15, I just get "! Dll not found or Call Dll error !".

I've verified the location of the dll. Also tried compiling as a x86 exe to try that dll. Strange. Guess it checks video memory or something which differs from a physical computer.

Adding a consolewrite on @error after the dllcall just gives me code 1, which according to dllcall help is

  1 = unable to use the DLL file,

- The problem has been corrected!

Trong

Posted

reDownload new version!

vulcan4d

Posted (edited)

Same issue with error but only on a fresh Win10 machine.

! Dll not found or Call Dll error !

The script works just fine on an existing Win10 computer but if you run this on a fresh installed Win10 machine 32 or 64bit this is the error you get.  Same script, same files, same locations.  There is clearly some kind of pre-requisite to use the DLL Call.  If there is any debug method I can provide this information.

Edited by vulcan4d
nklight

Posted (edited)

Same issue with vulcan4d

Tried these things below

  • Make sure you use my UDF and dll. => Using version updated January 31, 2020
  • Have you tried disabling your antivirus before running? => Yes
  • Did you test the example script? => Testing "_ImageSearch_Sample.au3"
  • Have you set Screen Scale and layout = 100%? => Yes, scale 100% at 1920*1080
  • Have you installed the display driver? => Yes, using latest driver for rx570

 

Image capture and save successfully then failed at function  DllCall(), result return = 0

Below is console log

>"D:\auto\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "D:\auto\AutoIT_ImageSearch\_ImageSearch_Sample.au3"    
--\\ ImageSearch by TRONG.LIVE //--  OSArch : X64 // AutoIT ver: 3.3.14.5 x86
-- WorkingDir      : D:\auto\AutoIT_ImageSearch
-- ScriptFullPath  : D:\auto\AutoIT_ImageSearch\_ImageSearch_Sample.au3
-- ImageSearchDLL  : D:\auto\AutoIT_ImageSearch\_ImageSearch_DLL\_ImageSearch.dll (17kb)
-- ScreenCapture   : X1=1042 Y1=342 X2=1095 Y2=383
! Search for images: D:\auto\AutoIT_ImageSearch\example.bmp
! Searching on the screen ...
! Dll not found or Call Dll error !
! Dll not found or Call Dll error !
! Dll not found or Call Dll error !
! Dll not found or Call Dll error !
! Dll not found or Call Dll error !
! Dll not found or Call Dll error !

>Process failed to respond; forcing abrupt termination...
>Exit code: 1    Time: 8.064

 

Please ask if you need further information.

 

========

Edit: VIP helped me figure out that VC++ is required for using ImageSearch.dll

make sure you have it or install with link below
https://www.techpowerup.com/download/visual-c-redistributable-runtime-package-all-in-one/

Edited by nklight
tellme

Posted (edited)

when i add

#include <GuiListView.au3> 

i get error as so i have to use GuiListView.au3 but cant so have to delete from #include one of them to run script, any solve for this one? thank you.

C:\Program Files (x86)\AutoIt3\Include\SecurityConstants.au3"(63,30) : error: $TOKENPRIMARY previously declared as a 'Const'

 

Edited by tellme
Zoric

Posted

No DLL found in the ZIP file

Trong

Posted

6 hours ago, Zoric said:

No DLL found in the ZIP file

The dll is already integrated in the UDF, you don't need to copy the dll!

kctvt

Posted

Hello, I have position (X,Y) already, I dont want to use mouse click to take ScreenCapture. How to do that ? 

 Could you give me some Example ? 

Trong

Posted

16 hours ago, kctvt said:

Hello, I have position (X,Y) already, I dont want to use mouse click to take ScreenCapture. How to do that ? 

 Could you give me some Example ? 

Script yourself to take pictures at that coordinate with your dimensions and store them for use with Image Search UDF

primetime

Posted

I'm testing this now in mid 2023 on Windows 11, and the script partially works. It appears as though it's finding the correct image location on screen, but what's actually happening is that the image that's being saved is offset, usually by ~100px in the y direction, and then it finds that location and re-applies the offset, so the cursor goes to the correct location but the image it's searching for is really the wrong image. This causes some other issues as you might imagine, when attempting to build programs, so I'm wondering if I'm missing some obvious fix or if anyone else has encountered this behaviour? Still, pretty amazing code, but I'd love to figure out this offset issue. Thanks!

HzStuff

Posted (edited)

Thanks for making this UDF. I have an issue on Windows 11 where if my screen is Scaled to more than 100%, the returned coordinates are bigger than expected.

It appears the returned values are about the multiple of the scaled factor. So if the scaling factor was 150%, the result will be 150% bigger than the actual location of the image.

This might be because AutoIt is DPI un-aware, but the DLL might be giving DPI aware values instead...

UDF Version: 2025.05.25.5

AutoIt version: 3.3.16.1

Edited by HzStuff
HzStuff

Posted

I have updated to the UDF version 3.3 and AutoIt version 3.3.18.0 (x32 version). My screen is scaled as mentioned before.

While using the UDF, setting MouseMove using the found coordinate, it is able to get to the correct image position. Using MouseGetPos within the program also returns the same coordinate. 

However, if I also run AutoIt Window Info at the same time, the reported mouse coordinates are different!!

If I stop the script running the UDF, then run another script with only MouseGetPos and manually move the mouse cursor to the image location it reports the same mouse coordinate as AutoIt Window Info, but not the same coordinates as the script using UDF.

It would seem that the UDF somehow changed the script to be DPI aware. I think this is something you need to warn the users about.

Trong

Posted

On 11/8/2025 at 4:41 PM, HzStuff said:

I have updated to the UDF version 3.3 and AutoIt version 3.3.18.0 (x32 version). My screen is scaled as mentioned before.

While using the UDF, setting MouseMove using the found coordinate, it is able to get to the correct image position. Using MouseGetPos within the program also returns the same coordinate. 

However, if I also run AutoIt Window Info at the same time, the reported mouse coordinates are different!!

If I stop the script running the UDF, then run another script with only MouseGetPos and manually move the mouse cursor to the image location it reports the same mouse coordinate as AutoIt Window Info, but not the same coordinates as the script using UDF.

It would seem that the UDF somehow changed the script to be DPI aware. I think this is something you need to warn the users about.

Yes, it affects mouse coordinates by using physical pixels (unscaled) instead of logical ones (scaled by Windows).

		HMODULE hUser = LoadLibraryW(L"user32.dll");
		if (hUser) {
			auto pSetCtx = (PFN_SetProcessDpiAwarenessContext)GetProcAddress(hUser, "SetProcessDpiAwarenessContext");
			if (pSetCtx) {
				const DPI_AWARENESS_CONTEXT ctx = (DPI_AWARENESS_CONTEXT)-4;
				pSetCtx(ctx);
			}
			else {
				auto pLegacy = (PFN_SetProcessDPIAware)GetProcAddress(hUser, "SetProcessDPIAware");
				if (pLegacy) pLegacy();
			}
			FreeLibrary(hUser);
		}

 

HzStuff

Posted (edited)

Given it does makes AutoIt to be DPI aware, this creates a problem for anything GUI related if someone uses it on a scaled monitor.

I have created 2 scripts. Both create the same form. The difference is that one uses UDF and the other does not. (I have attached both scripts for you to test).

On a non-100% scaled monitor, the result is:

  • The forms created are different size and in different location.
  • The reported desktop sizes are different.
  • The reported mouse coordinates are different. 

Is there anyway to change the UDF so that it doesn't affect the DPI awareness of AutoIt?

MouseCheck-noUDF.au3 MouseCheck-ImageSearchUDF.au3

Edited by HzStuff
Trong

Posted

On 11/10/2025 at 4:35 PM, HzStuff said:

Given it does makes AutoIt to be DPI aware, this creates a problem for anything GUI related if someone uses it on a scaled monitor.

I have created 2 scripts. Both create the same form. The difference is that one uses UDF and the other does not. (I have attached both scripts for you to test).

On a non-100% scaled monitor, the result is:

  • The forms created are different size and in different location.
  • The reported desktop sizes are different.
  • The reported mouse coordinates are different. 

Is there anyway to change the UDF so that it doesn't affect the DPI awareness of AutoIt?

MouseCheck-noUDF.au3 1.21 kB · 3 downloads MouseCheck-ImageSearchUDF.au3 2.59 kB · 3 downloads

Fixed, dll only applies internal dpi dl, will not affect AutoIt GUI!

×
×
  • Create New...