ntprohd

Image Search does not occupy screen

10 posts in this topic

I have a question how to use Image Search on any one window, while moving and hide windows can still find pictures

Share this post


Link to post
Share on other sites



Welcome,

I am not really sure what your question is but am relatively sure the question is asked before, so did you search the forums?

Jos


Visit the SciTE4AutoIt3 Download page for the latest versions  - Beta files                                How to post scriptsource        Forum Rules
 
Live for the present,
Dream of the future,
Learn from the past.
  :)

Share this post


Link to post
Share on other sites

The ImageSearch.dll file can search a hBitmap (handle to a bitmap object) instead of just a defined area. You'll need to capture the window (Just a hint, you'll need #ReqauireAdmin if you want to capture the window even if it's hidden) and pass the $hBitmap object in the DLL call. Be sure to delete your object when you're done.

Share this post


Link to post
Share on other sites
On 6/2/2016 at 9:34 PM, InunoTaishou said:

The ImageSearch.dll file can search a hBitmap (handle to a bitmap object) instead of just a defined area. You'll need to capture the window (Just a hint, you'll need #ReqauireAdmin if you want to capture the window even if it's hidden) and pass the $hBitmap object in the DLL call. Be sure to delete your object when you're done.

Can you tell me more how I can do that, if you have a script that is available you can share it to me, I am a novice to learn about AutoIt. thank you!

Share this post


Link to post
Share on other sites

#5 ·  Posted (edited)

#include-once
Func CaptureWindow($iLeft = 0, $iTop = 0, $iWidth = -1, $iHeight = -1, Const $save_image = False, Const $hWnd_window)
    Local $rect_window = WinGetPos($hWnd_window)
    Local $hDC = _WinAPI_GetWindowDC($hWnd_window)
    Local $hDestDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $rect_window[2] - 16, $rect_window[3] - 38)
    Local $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
    Local $hSrcDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBmp = _WinAPI_CreateCompatibleBitmap($hDC, $rect_window[2] - 16, $rect_window[3] - 38)
    Local $hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBmp)
    
    _WinAPI_PrintWindow($hWnd_window, $hSrcDC, True)
    
    ScreenToClient($hWnd_window, $iLeft, $iTop)
    
    If ($iWidth > 0 and $iHeight > 0) Then
        
        _WinAPI_BitBlt($hDestDC, $iLeft, $iTop, $iWidth, $iHeight, $hSrcDC, $iLeft, $iTop, $MERGECOPY)
    Else
        _WinAPI_BitBlt($hDestDC, $iLeft, $iTop, $rect_window[2] - 16 - $iLeft, $rect_window[3] - 38 - $iTop, $hSrcDC, $iLeft, $iTop, $MERGECOPY)
    EndIf
    
    _WinAPI_SelectObject($hDestDC, $hDestSv)
    _WinAPI_SelectObject($hSrcDC, $hSrcSv)
    _WinAPI_ReleaseDC($hWnd_window, $hDC)
    _WinAPI_DeleteDC($hDestDC)
    _WinAPI_DeleteDC($hSrcDC)
    _WinAPI_DeleteObject($hBmp)
    
    If ($save_image) Then _ScreenCapture_SaveImage(@ScriptDir & "\CaptureWindow.jpg", $hBitmap, False)
    
    Return $hBitmap
EndFunc   ;==>CaptureWindow

Func ScreenToClient(Const ByRef $hWnd, ByRef $iX, ByRef $iY)
    DllStructSetData($struct_client_screen, 1, $iX)
    DllStructSetData($struct_client_screen, 2, $iY)
    
    DllCall($HWND_DLL_USER32, "int", "ScreenToClient", "hwnd", $hWnd, "ptr", DllStructGetPtr($struct_client_screen))
    
    $iX = DllStructGetData($struct_client_screen, 1)
    $iY = DllStructGetData($struct_client_screen, 2)
EndFunc   ;==>ClientToScreen

 

Edited by InunoTaishou

Share this post


Link to post
Share on other sites
12 hours ago, InunoTaishou said:
#include-once
Func CaptureWindow($iLeft = 0, $iTop = 0, $iWidth = -1, $iHeight = -1, Const $save_image = False, Const $hWnd_window)
    Local $rect_window = WinGetPos($hWnd_window)
    Local $hDC = _WinAPI_GetWindowDC($hWnd_window)
    Local $hDestDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $rect_window[2] - 16, $rect_window[3] - 38)
    Local $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
    Local $hSrcDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBmp = _WinAPI_CreateCompatibleBitmap($hDC, $rect_window[2] - 16, $rect_window[3] - 38)
    Local $hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBmp)
    
    _WinAPI_PrintWindow($hWnd_window, $hSrcDC, True)
    
    ScreenToClient($hWnd_window, $iLeft, $iTop)
    
    If ($iWidth > 0 and $iHeight > 0) Then
        
        _WinAPI_BitBlt($hDestDC, $iLeft, $iTop, $iWidth, $iHeight, $hSrcDC, $iLeft, $iTop, $MERGECOPY)
    Else
        _WinAPI_BitBlt($hDestDC, $iLeft, $iTop, $rect_window[2] - 16 - $iLeft, $rect_window[3] - 38 - $iTop, $hSrcDC, $iLeft, $iTop, $MERGECOPY)
    EndIf
    
    _WinAPI_SelectObject($hDestDC, $hDestSv)
    _WinAPI_SelectObject($hSrcDC, $hSrcSv)
    _WinAPI_ReleaseDC($hWnd_window, $hDC)
    _WinAPI_DeleteDC($hDestDC)
    _WinAPI_DeleteDC($hSrcDC)
    _WinAPI_DeleteObject($hBmp)
    
    If ($save_image) Then _ScreenCapture_SaveImage(@ScriptDir & "\CaptureWindow.jpg", $hBitmap, False)
    
    Return $hBitmap
EndFunc   ;==>CaptureWindow

Func ScreenToClient(Const ByRef $hWnd, ByRef $iX, ByRef $iY)
    DllStructSetData($struct_client_screen, 1, $iX)
    DllStructSetData($struct_client_screen, 2, $iY)
    
    DllCall($HWND_DLL_USER32, "int", "ScreenToClient", "hwnd", $hWnd, "ptr", DllStructGetPtr($struct_client_screen))
    
    $iX = DllStructGetData($struct_client_screen, 1)
    $iY = DllStructGetData($struct_client_screen, 2)
EndFunc   ;==>ClientToScreen

thank you for the enthusiasm to help but I do not really understand when you look at what you write, you can send me a complete example of application, as I said I only learn about AutoIt, you have can give me your skype so I can ask you a few things, my skype is: xoancpa88

Share this post


Link to post
Share on other sites

No, the forums are for asking for help with your scripts.

That function takes x, y, width, height coordinates and a handle to the window you're trying to capture (although things are a bit out of order, the way I was using it the $hWnd_window had a default value, I removed it for this post).

I won't explain everything but _WinApi_PrintWindow captures the client area (the true at the end means client, changing that false captures the whole window, I was only ever interested in the client for my purposes) and saves the object in $hSrcDC.

I transformed the coordinates to work with to client coordinates (since I wanted my script to work on my window regardless of where it was and I was unable to use ControlClick for my automation, I could not use client coordinates by default)

I then transferred the DC using _WinAPI_BitBlt to the $hDestDC object. I did not scale the image, instead (for my purposes) i just left the unused part of the image black (since you're doing image searching the black area does not matter but if I ever wanted to save it I wanted to see what area was actually being preserved).

After that I cleaned up resources, saved image if requested, and returned an $hBitmap object (this is a handle to a bitmap, same as _ScreenCapture_Capture)

To use the $hBitmap for image searching you can do this

Local $hBitmap = CaptureWindow(100, 100, 400, 200, False, WinGetHandle("Notepad++"))

$result = DllCall("ImageSearchDLL.dll", "str", "ImageSearchEx", "int", $left, "int", $top, "int", $right, "int", $bottom, "str", $image_to_find, "ptr", $hBitmap)

I don't know what your imagesearch function looks like, mine has been altered. But the function you call will be ImageSearchEX and you pass the $hBitmap object in the last parameter.

Share this post


Link to post
Share on other sites
2 hours ago, InunoTaishou said:

No, the forums are for asking for help with your scripts.

That function takes x, y, width, height coordinates and a handle to the window you're trying to capture (although things are a bit out of order, the way I was using it the $hWnd_window had a default value, I removed it for this post).

I won't explain everything but _WinApi_PrintWindow captures the client area (the true at the end means client, changing that false captures the whole window, I was only ever interested in the client for my purposes) and saves the object in $hSrcDC.

I transformed the coordinates to work with to client coordinates (since I wanted my script to work on my window regardless of where it was and I was unable to use ControlClick for my automation, I could not use client coordinates by default)

I then transferred the DC using _WinAPI_BitBlt to the $hDestDC object. I did not scale the image, instead (for my purposes) i just left the unused part of the image black (since you're doing image searching the black area does not matter but if I ever wanted to save it I wanted to see what area was actually being preserved).

After that I cleaned up resources, saved image if requested, and returned an $hBitmap object (this is a handle to a bitmap, same as _ScreenCapture_Capture)

To use the $hBitmap for image searching you can do this

Local $hBitmap = CaptureWindow(100, 100, 400, 200, False, WinGetHandle("Notepad++"))

$result = DllCall("ImageSearchDLL.dll", "str", "ImageSearchEx", "int", $left, "int", $top, "int", $right, "int", $bottom, "str", $image_to_find, "ptr", $hBitmap)

I don't know what your imagesearch function looks like, mine has been altered. But the function you call will be ImageSearchEX and you pass the $hBitmap object in the last parameter.

you can send me a specific example, and I have something to ask you to help you with any code like but do not take up rat MouseClickDrag ControlClickDrag

Share this post


Link to post
Share on other sites

#9 ·  Posted (edited)

On 10.02.2016 at 8:08 PM, InunoTaishou said:
#include-once
Func CaptureWindow($iLeft = 0, $iTop = 0, $iWidth = -1, $iHeight = -1, Const $save_image = False, Const $hWnd_window)
    Local $rect_window = WinGetPos($hWnd_window)
    Local $hDC = _WinAPI_GetWindowDC($hWnd_window)
    Local $hDestDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $rect_window[2] - 16, $rect_window[3] - 38)
    Local $hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap)
    Local $hSrcDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBmp = _WinAPI_CreateCompatibleBitmap($hDC, $rect_window[2] - 16, $rect_window[3] - 38)
    Local $hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBmp)
    
    _WinAPI_PrintWindow($hWnd_window, $hSrcDC, True)
    
    ScreenToClient($hWnd_window, $iLeft, $iTop)
    
    If ($iWidth > 0 and $iHeight > 0) Then
        
        _WinAPI_BitBlt($hDestDC, $iLeft, $iTop, $iWidth, $iHeight, $hSrcDC, $iLeft, $iTop, $MERGECOPY)
    Else
        _WinAPI_BitBlt($hDestDC, $iLeft, $iTop, $rect_window[2] - 16 - $iLeft, $rect_window[3] - 38 - $iTop, $hSrcDC, $iLeft, $iTop, $MERGECOPY)
    EndIf
    
    _WinAPI_SelectObject($hDestDC, $hDestSv)
    _WinAPI_SelectObject($hSrcDC, $hSrcSv)
    _WinAPI_ReleaseDC($hWnd_window, $hDC)
    _WinAPI_DeleteDC($hDestDC)
    _WinAPI_DeleteDC($hSrcDC)
    _WinAPI_DeleteObject($hBmp)
    
    If ($save_image) Then _ScreenCapture_SaveImage(@ScriptDir & "\CaptureWindow.jpg", $hBitmap, False)
    
    Return $hBitmap
EndFunc   ;==>CaptureWindow

Func ScreenToClient(Const ByRef $hWnd, ByRef $iX, ByRef $iY)
    DllStructSetData($struct_client_screen, 1, $iX)
    DllStructSetData($struct_client_screen, 2, $iY)
    
    DllCall($HWND_DLL_USER32, "int", "ScreenToClient", "hwnd", $hWnd, "ptr", DllStructGetPtr($struct_client_screen))
    
    $iX = DllStructGetData($struct_client_screen, 1)
    $iY = DllStructGetData($struct_client_screen, 2)
EndFunc   ;==>ClientToScreen

 

Unfortunately, this Code does not work as stable. Making parts of the image as black. One screen shows a complete black out in the resolution. Prepared with AutoIt example "MyBot" we are looking for the feature is available. Visual scanning in the background present.

Edited by Burak

Share this post


Link to post
Share on other sites

Some apllications prevents themself from screencapturing.

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now