Что нового

imagesearch не работает на win7 x64

Seen

Новичок
Сообщения
8
Репутация
0
Всем привет. В общем коротко по сути.
Установил au3 последней версии нашел imagesearch.au3 и ImageSearchDLL.dll для x64. Запустил ... и не работает писал про ошибку. Ошибку вроде удалось исправить найдя ответ на одной из ветки форума.

Код:
; If error exit
If Not IsArray($result) Then Return 0
If $result[0] = 0 Then Return 0

Ок ошибка пропала. Но сейчас просто поиск картинки не производиться. Если запусить от x86 то выбивает с ошибкой appcrash.
Сигнатура проблемы:
Имя события проблемы: APPCRASH
Имя приложения: AutoIt3.exe
Версия приложения: 3.3.14.2
Отметка времени приложения: 55fc1979
Имя модуля с ошибкой: AutoIt3.exe
Версия модуля с ошибкой: 3.3.14.2
Отметка времени модуля с ошибкой: 55fc1979
Код исключения: c0000005
Смещение исключения: 00020e42
Версия ОС: 6.1.7601.2.1.0.256.48
Код языка: 1049
Дополнительные сведения 1: 0a9e
Дополнительные сведения 2: 0a9e372d3b4ad19135b953a78882e789
Дополнительные сведения 3: 0a9e
Дополнительные сведения 4: 0a9e372d3b4ad19135b953a78882e789

Если от x64 то просто не производиться поиска.
Тестил на этом.

Код:
#include <ImageSearch.au3>

HotKeySet("{F9}","Start")
HotKeySet("{F10}","Stop")

while 1
    sleep(1000)
WEnd



Func Start()
    Local $x1 = 0, $y1 = 0
    $result = _ImageSearch("1234.bmp",1,$x1,$y1,0)
    if $result=1 Then
        MouseMove($x1,$y1,3)
    EndIf
EndFunc

Func stop()
    Exit
EndFunc


В чем может быть проблема ??? мучаюсь уж не первый день ответ не удалось найти.

PS пробовал копировать dll в папку Windows\System32 и Windows\SysWOW64 но это не помогло :'(
так же dll лежит в папке где и скрипт.

PSS пробовал и более старую версию au3 точно не помню релиз но так же безрезультатно. Года 3-5 назад с ней все работало на 7ке. А сейчас прям не знаю что еще можно сделать.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
У меня на Windows7x64 тоже не работает, зато прекрасно работает "BmpSearch.au3" может эта UDF Вас устроит ?
 
Автор
S

Seen

Новичок
Сообщения
8
Репутация
0
посмотрел... слишком сложно как то и выбивает ошибку

[box title=TitleBox]"C:\Program Files (x86)\AutoIt3\Include\BmpSearch.au3" (46) : ==> Variable must be of type "Object".:
Local $iRowInc = ($tSizeSource.X - $tSizeFind.X) * 4
Local $iRowInc = ($tSizeSource.X - $tSizeFind^ ERROR
>Exit code: 1 Time: 0.5875[/box]

А более простого аналога нет ? или может все же есть варианты как запустить imagesearch ?
 

mr.Gbabak

Осваивающий
Сообщения
257
Репутация
23
Вот вам привет поиска на рабочем столе:
Код:
#include "BmpSearch.au3"
#include <ScreenCapture.au3>
_GDIPlus_Startup()
$win = 'Program Manager'
	  $hSource = _ScreenCapture_CaptureWnd ('', WinGetHandle ($win))
	  $hBmp = _GDIPlus_BitmapCreateFromFile(@ScriptDir&'\1.bmp')

	  $hFind = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
	  ;ConsoleWrite ('5'&@CRLF)
	  $aCoords = _BmpSearch($hSource, $hFind, 1)

		 If @error Then
		   ConsoleWrite("не найдено" & @CRLF)


		 Else
		 $x = $aCoords[1][2]
			$y = $aCoords[1][3]
		 ConsoleWrite('найдено ' & @CRLF)
	  ConsoleWrite('x= '&$x & @CRLF)
	   ConsoleWrite('y= '&$y & @CRLF)

EndIf
_WinAPI_DeleteObject($hSource)
    _WinAPI_DeleteObject($hFind)

Поиск через эту UDF работает гораздо быстрее.
 
Автор
S

Seen

Новичок
Сообщения
8
Репутация
0
а не у кого нет мануала по данному UDF ? в сети очень мало информации по нему ...
очень уж сложно выглядят скрипны в нем ... я уже молчу что будет если нужен поиск более 1 картинки ....
 
A

Alofa

Гость
Seen сказал(а):
а не у кого нет мануала по данному UDF ?...
Уже как-то и не понятно о каких вышеперечисленных UDF идет речь?

На будущее, если вы не находите информацию по какой-либо UDF библиотеке:
- обратитесь к описанию, которое дал первоисточник, откуда вы качали данную UDF;
- откройте саму библиотеку.au3 и читайте комментарии перед каждой функцией - там вы найдете все, что вам нужно;
- если есть примеры работы от разработчика - изучите их.

Так вот, если вы о "ImageSearch", то внимательно прочитайте и строго следуйте этим инструкциям.
Примечание: скрипт будет работоспособным только в скомпилированном виде соответствующей разрядности.

Код:
#include "ImageSearch.au3"

Global $y = 0, $x = 0
Send('#d') ; Перед использованием "ImageSearch" необходимо чтобы рабочий стол был виден

Local $search = _ImageSearch('1234.bmp', 0, $x, $y, 0)
If $search = 1 Then
	MouseMove($x, $y, 10)
	MsgBox(64, '', '$search = ' &$search &@CR& 'Успех!')
Else
	MsgBox(16, '', '$search = ' &$search &@CR& 'Облом!')
EndIf

Также почитайте Здесь и Это вам пригодится.
 

Yura

Знающий
Сообщения
36
Репутация
7
mr.Gbabak сказал(а):
Поиск через эту UDF работает гораздо быстрее.

Через ImageSearch у меня картинку размером 150х50 независимо от расположения на экране 1366х768 находит быстрее чем за 20 мс. Вы считаете, что это слишком долго?
Когда пользуетесь ImageSearch, то внимательно относитесь к параметру $tolerance, его увеличение значительно увеличивает время поиска, что и понятно. Также не раз видел на форуме утверждение, что ImageSearch ищет только на экране. Это не так!
Код:
_ImageSearch($findImage,$resultPosition,ByRef $x, ByRef $y,$tolerance, $HBMP=0)
Когда $HBMP=0, то из экрана. Но вы можете получить $HBMP из любого окна просто сделав его скриншот. У меня на Вин 7 картинки ищет даже из перекрытого или сдвинутого за границу экрана окна. Главное сделать скриншот этого окна:
Код:
#include <GDIPlus.au3>
#include <WinAPIex.au3>

_GDIPlus_Startup()

$hWnd_win = WinGetHandle("---") ; вместо --- вставить title окна
$iWidth = _WinAPI_GetWindowWidth($hWnd_win)
$iHeight = _WinAPI_GetWindowHeight($hWnd_win)

Global $hBMP = _WinCapture($hWnd_win, $iWidth, $iHeight)
_WinAPI_SaveHBITMAPToFile("!!window.bmp", $hBMP) ; запись в файл

_WinAPI_DeleteObject($hBMP)
_GDIPlus_Shutdown()

Func _WinCapture($hWnd, $iWidth, $iHeight)
    Local $iH, $iW, $hDDC, $hCDC, $hBMP

    $hDDC = _WinAPI_GetDC($hWnd)
    $hCDC = _WinAPI_CreateCompatibleDC($hDDC)
    $hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight)
    _WinAPI_SelectObject($hCDC, $hBMP)

    DllCall("User32.dll", "int", "PrintWindow", "hwnd", $hWnd, "hwnd", $hCDC, "int", 0)
    ;_WinAPI_BitBlt($hCDC, 0, 0, $iW, $iH, $hDDC, 0, 0, 0x00330008)

    _WinAPI_ReleaseDC($hWnd, $hDDC)
    _WinAPI_DeleteDC($hCDC)

    Return $hBMP
EndFunc   ;==>_WinCapture

и вместо "0" в $HBMP=0 использовать полученный $hBMP.
У BmpSearch.au3 нет параметра $tolerance. И если хоть 1 пиксель хоть минимально не совпадет по цвету- картинку не найдет. Если вам существенно найти картинку не за 20 мс, а за 2 мс, но при этом никакой настройки по отклонению цветов- BmpSearch ваш выбор. Но не удивляйтесь, если вдруг на другом компьютере ваш скрипт не будет находить картинки.

Еще можно пользовать _GDIPlus_ImageScale, чтоб уменьшить размер скриншота и искомой картинки, тогда искать должно быстрее.

Код автора темы:
Код:
#include <ImageSearch.au3>

HotKeySet("{F9}","Start")
HotKeySet("{F10}","Stop")

while 1
    sleep(1000)
WEnd

Func Start()
    Local $x1 = 0, $y1 = 0
    $result = _ImageSearch("1234.bmp",1,$x1,$y1,0)
    if $result=1 Then
        MouseMove($x1,$y1,3)
    EndIf
EndFunc

Func stop()
    Exit
EndFunc

у меня на х86 работает. Попробуйте вместо MouseMove($x1,$y1,3) написать MsgBox(0, "", $x1&" "&$y1), что напишет.
 

vovsla

Осваивающий
Сообщения
607
Репутация
36
Autoit v3.3.10.2 imagesearch работает на win7 x64 без проблем


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

Мне написали в личку с просьбой поделиться библиотекой, на всякий случай выложу всем, вдруг кому еще пригодиться
https://yadi.sk/d/yGxpsF8Zkx3N8
 
Верх