Что нового

Поиск битмапа в скриншоте через WinApi

Ilyialat

Новичок
Сообщения
54
Репутация
2
Решил сделать аналог imagesearch, который у меня не работает =)
Но... Есть проблеммы, и я не знаю как их решить...
Помогите пожалуйста, кому не лень =)
Код:
#include <WinApiEx.au3>
#include <WinAPI.au3> 
#include <WindowsConstants.au3>
Global $hWnd = WinGetHandle('[active]')
Global $Size = WinGetClientSize($hWnd)
Global $L = $Size[0] * $Size[1]


Func SearchBmp($filename = 'bitmap1.bmp')
Local $hDC = _WinAPI_GetDC($hWnd)
Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
Local $hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
_WinAPI_BitBlt($hMemDC, 0, 0, $Size[0], $Size[1], $hDC, 0, 0, $SRCCOPY)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_ReleaseDC($hWnd, $hDC)
Local $tBits = DllStructCreate('dword[' & $L & ']')
_WinAPI_GetBitmapBits($hBitmap, 4 * $L, DllStructGetPtr($tBits))
;скриншот есть


;$hBitmap=FileOpen($filename)
Local $tt=0
Local $size = FileGetSize($filename) 
$t1Bits = DllStructCreate('dword[' & $size & ']')
_WinAPI_LoadBitmap($tt,$filename) ;тут проблеммы начинаются, ничего не придумал... Пытаюсь загрузить битмап
_WinAPI_GetBitmapBits($tt, $size*4, DllStructGetPtr($t1Bits)) ;Безуспешно пытаюсь загрузить битмап в структуру
For $t=1 to $L Step 1        ;Промотка битов скриншота
For $t1=1 to $size Step 1    ;Промотка битов битмапа
   If DllStructGetData($tBits, 1, $t) <> DllStructGetData($t1Bits, 1, $t1) Then ;сверяем биты картинок , если они полностью совпадают - пишем корды
	  ExitLoop(1)
   ElseIf $t1 == $size Then
	  ConsoleWrite('x='&Mod($t, @DesktopWidth)- 1 &' y='&Ceiling($t / @DesktopWidth) - 1&@CR) ;у меня эта ... с $size[0,1] отказывается работать, заменил на собаку
   EndIf
Next
Next

_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteObject($hMemDC)
_WinAPI_DeleteObject($hSv)
_WinAPI_DeleteObject($hDC)
_WinAPI_DeleteObject($tt)
EndFunc
SearchBmp()
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Автор
I

Ilyialat

Новичок
Сообщения
54
Репутация
2
Что-то отдаленно напоминающее то, что я хочу. До конца функция не доработана и не работает
Код:
#include <WinApiEx.au3>
#include <WinAPI.au3> 
#include <WindowsConstants.au3>
#Include <APIConstants.au3>
#Include <Misc.au3>
#include <GDIPlus.au3>
#include <GDIP.au3>
Sleep(5000)
$hWnd = WinGetHandle('[active]')
$Size = WinGetClientSize($hWnd)
$Size[0]=@DesktopWidth
$Size[1]=@DesktopHeight
$L = $Size[0] * $Size[1]


Func SearchBmp($bmp)
Local $hDC = _WinAPI_GetDC($hWnd)
Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $Size[0], $Size[1])
Local $hSv = _WinAPI_SelectObject($hMemDC, $hBitmap)
_WinAPI_BitBlt($hMemDC, 0, 0, $Size[0], $Size[1], $hDC, 0, 0, $SRCCOPY)
_WinAPI_SelectObject($hMemDC, $hSv)
_WinAPI_DeleteDC($hMemDC)
_WinAPI_ReleaseDC($hWnd, $hDC)
Local $tBits = DllStructCreate('dword[' & $L & ']')
_WinAPI_GetBitmapBits($hBitmap, $L * 4, DllStructGetPtr($tBits))
;скриншот есть

_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromFile($bmp)
$iWidth = _GDIPlus_ImageGetWidth($hImage)
$iHeight = _GDIPlus_ImageGetHeight($hImage)
$size=$iWidth*$iHeight
$iBitmap1 = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
$hBitmap1 = _GDIPlus_BitmapCreateFromHBITMAP($iBitmap1)
$tBits1 = DllStructCreate('dword[' & $size & ']')
_WinAPI_GetBitmapBits($iBitmap1, $size * 4, DllStructGetPtr($tBits1))


For $t1=1 to $L Step 1        ;Промотка битов скриншота
For $t2=1 to $size
	  If DllStructGetData($tbits,1,$t1+$t2) <> DllStructGetData($tbits1,1,$t2+$t2) Then
	  ExitLoop(1)
      Else
	  If $t2-200>$size Then
	  $xx = Mod($t1, @DesktopWidth)- 1
	  $yy = Ceiling($t1 / @DesktopWidth) - 1
	  MsgBox(0,$xx,$yy)
	  EndIf
      EndIf
Next
Next
_WinAPI_DeleteObject($hBitmap)
_WinAPI_DeleteObject($hMemDC)
_WinAPI_DeleteObject($hSv)
_WinAPI_DeleteObject($hDC)
_GDIPlus_ImageDispose($hImage)
_WinAPI_DeleteObject($iBitmap1)
_WinAPI_DeleteObject($hBitmap1)
_GDIPlus_Shutdown()
EndFunc
SearchBmp('ff1.bmp')
Смысл таков:
1) Мы делаем скрин экрана
2) Мы берём биты из битмапа(в данном случае ff1.bmp)
3) Мы сравниваем биты скриншота и ff1
3.1)Биты одинаковы до $t2-200 - значит успех. Забираем корды
3.2)Какой-то бит не прошел проверку, нам больше не нужно сверять остальные биты ff1 с битами скриншота, начинаем проверять дальше




Добавлено:
Сообщение автоматически объединено:

Заставил работать ImageSearch, но всё ещё интересует скорость работы WinApi... ImageSearch ~ 1 сек
 
Верх