|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
||||
|
||||
angvelem, спасибо за помощь
Однако что касается кода - он все равно почему то ищет пиксели только в правой части картинки. Ладно, посижу еще подумаю... Дело в том что мы никогда не попадаем в точку 369, 226. Только что вставлял в функцию поиска пикселя код: Код:
if (CursorPosition.X = 369) and (CursorPosition.Y = 226) then MessageDlg('Мы попали на координаты!', mtConfirmation, [mbYes], 0); |
#17
|
||||
|
||||
Потому что в левой части ничего похожего нет.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#18
|
||||
|
||||
А вот не проще использовать функцию WindowFromPoint? т.е. получить идентификатор окна приложения-игры, и потом статическими координатами обращаться непосредственно к нему, а не отсчитывать координаты положения окна?
ну вроде вот ошибка Код:
function FindPixel(FindColor, X, Y, StopX, StopY: Integer): CursorXY; var X1 : Integer; Flag : Boolean; begin Result.Res:= False; Flag := False; while Y <= StopY-1 do begin for X1:= X to StopX-1 do begin SetCursorPos(X1, Y); if Form1.Image1.Picture.Bitmap.Canvas.Pixels[X1, Y] = FindColor then begin Result.X := X1; {возвращаем координаты найденного пикселя} Result.Y := Y; Result.Res := True; {а также информацию о том что пиксель найден} Flag := True; {мы нашли наш пиксель} Break; {значит выходим из цикла} end; end; x:=0; ///--- !!!! if Flag then {если завершили внутренний цикл - завершаем и внешний} Break; Inc(Y); end; end; После поиска массива, и не обнаружения пикселя, в функцию поиска идут координаты X не с 0, а от туда где закончился поиск массива цветов,... бла-бла-бла. Вообщем после окончания продолжения поиска по X, надо сказать что следующая строчка пошла с 0. Програмистами не рождаются, ими становятся! Последний раз редактировалось SCrat.ORS, 27.08.2013 в 17:27. |
Этот пользователь сказал Спасибо SCrat.ORS за это полезное сообщение: | ||
Speech (27.08.2013)
|
#19
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#20
|
||||
|
||||
SCrat.ORS, спасибо тебе большущее!!!
Всего одна такая маленькая строчка решила всю работоспособность кода. Работает сейчас как часики. angvelem, также спасибо Цитата:
Цитата:
|
#21
|
||||
|
||||
Описал бы задачу подробнее, может и идей было бы больше.
jmp $ ; Happy End! The Cake Is A Lie. |
#22
|
||||
|
||||
Цитата:
Програмистами не рождаются, ими становятся! |
#23
|
||||
|
||||
SCrat.ORS, можешь показать этот код? Поиск нужных координат нужно. А посылка сообщения игре в данном случае не поможет - там надо именно мышкой водить, чтобы бриллианты собирать. А то пальцы на тачпаде протру скоро
|
#24
|
||||
|
||||
Кидаешь на форму TImage с картинкой типа "мишень" - кому что нравится, далее используем DragAndDrop, в свойствах DragMode ставишь dmAutomatic, и в событии EndDrag пишешь код:
Код:
var Hwnd_window:THandle; //хендл окна HwndRect:Trect; //rect окна screen_dc:hdc; //контекст окна bmp:tbitmap; //картинка куда все рисуем m_Canvas:TCanvas; // канва окна ... implementation ... procedure TForm1.Image1EndDrag(Sender, Target: TObject; X, Y: Integer); var hWnd: THandle; begin hWnd := WindowFromPoint(Point(x,y)); //получаем идентификатор окна Hwnd_window:=hWnd; //делаем его глобальным - в принципе лишняя строчка GetWindowRect(hwnd,HwndRect); // получаем границы окна screen_dc:=GetDC(Hwnd_window); // получаем графический контекст M_Canvas:=TCanvas.Create; //создаём канву M_Canvas.Handle:=screen_DC; // получаем канву end; Нашли и хендл и канву. Если надо получить изображение то по функции/таймеру делаем Код:
bmp:=TBitmap.Create; //создаём картинку bmp.Width := HwndRect.right; //задаём размеры Bmp.Height := HwndRect.Bottom; //создание картинки и задание размеров делается в FormCreate Bmp.Canvas.Copyrect(Rect(0,0, Bmp.Width,Bmp.Height), m_Canvas, Rect(0,0,HwndRect.Rigth-HwndRect.left, HwndRect.bottom-HwndRect.top)); //копируем изображение из окна далее если надо тыкнуть мышкой в окно Код:
procedure TForm1.clik(xm,ym:integer); var Lparams: Lparam; begin LPARAMs:=makelparam(xm,ym); postmessage(Hwnd_window,WM_LBUTTONDOWN,MK_LBUTTON,LPARAMs); //нажимаем кнопку sleep(10); postmessage(Hwnd_window,WM_LBUTTONUP,0,LPARAMs); //отпускаем кнопку end; В принципе должны быть и сообщения для перемещения курсора. Типа WM_MOUSEMOVE. Дальше с bmp работаешь как хочешь - ищешь пиксели или анализируешь, но помним, что если нашёл координаты нужного пикселя, то его координаты будут относительно bmp(окна) а не начала экрана. т.е 0 в bmp - это HwndRect.left/top на экране. Програмистами не рождаются, ими становятся! Последний раз редактировалось SCrat.ORS, 28.08.2013 в 12:43. |
Этот пользователь сказал Спасибо SCrat.ORS за это полезное сообщение: | ||
Speech (28.08.2013)
|
#25
|
||||
|
||||
SCrat.ORS, вот спасибо так спасибо
Цитата:
|