Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 27.08.2013, 15:39
Аватар для Speech
Speech Speech вне форума
Новичок
 
Регистрация: 16.02.2012
Сообщения: 55
Репутация: 10
По умолчанию

angvelem, спасибо за помощь
Однако что касается кода - он все равно почему то ищет пиксели только в правой части картинки. Ладно, посижу еще подумаю...
Дело в том что мы никогда не попадаем в точку 369, 226. Только что вставлял в функцию поиска пикселя код:
Код:
        if (CursorPosition.X = 369) and (CursorPosition.Y = 226) then
          MessageDlg('Мы попали на координаты!', mtConfirmation, [mbYes], 0);
Не дало ничего...
Ответить с цитированием
  #17  
Старый 27.08.2013, 16:08
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Потому что в левой части ничего похожего нет.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #18  
Старый 27.08.2013, 17:08
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

А вот не проще использовать функцию 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  
Старый 27.08.2013, 21:50
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Вообщем после окончания продолжения поиска по X, надо сказать что следующая строчка пошла с 0.
Так и сделано, только уже в моём варианте.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #20  
Старый 27.08.2013, 22:58
Аватар для Speech
Speech Speech вне форума
Новичок
 
Регистрация: 16.02.2012
Сообщения: 55
Репутация: 10
По умолчанию

SCrat.ORS, спасибо тебе большущее!!!
Всего одна такая маленькая строчка решила всю работоспособность кода. Работает сейчас как часики.
angvelem, также спасибо

Цитата:
Сообщение от SCrat.ORS
А вот не проще использовать функцию WindowFromPoint? т.е. получить идентификатор окна приложения-игры, и потом статическими координатами обращаться непосредственно к нему, а не отсчитывать координаты положения окна?
Я спрашивал раньше о подобном варианте, на что мне ответили:
Цитата:
Сообщение от Aristarh Dark
Тут возможны варианты:
1. Если ты (можно сразу на ты?) ищещь определенный текст в определенном браузере - это просто.
2. Если ты ищещь определенный текст в любом браузере - это чуть сложнее, но тож просто.
3. Если ты ищещь определенный текст неизвестно где - это решаемо, но ты не потянешь.

ЗЫЖ если придумал мегабота для очередной онлайн херни - поверь, ты не одинок.
Но я человек упрямый и настойчивый. Все что очень сильно хочу сделать - в конечном итоге делаю Хоть иногда на это и годы уходят...
Ответить с цитированием
  #21  
Старый 27.08.2013, 23:06
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Описал бы задачу подробнее, может и идей было бы больше.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #22  
Старый 28.08.2013, 08:49
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Цитата:
Сообщение от Speech
Тут не совсем про то что я говорил. Если используешь WindowFromPoint и получаешь хендл нужного тебе окна, то далее можно снять Canvas с него, а значит получить изображение того что в этом окне. а вот как от туда снаять нужный текст - это уже, откровенно говоря, без понятия. Я использовал этот метод для того что бы снять Canvas, проанализировать что там, и тыкнуть мышкой в нужное место, - что, кстати, элементарно делается отправкой сообщения (PostMessage) непосредственно окну игры, следовательно сама мышка не затрагивается.
__________________
Програмистами не рождаются, ими становятся!
Ответить с цитированием
  #23  
Старый 28.08.2013, 11:33
Аватар для Speech
Speech Speech вне форума
Новичок
 
Регистрация: 16.02.2012
Сообщения: 55
Репутация: 10
По умолчанию

SCrat.ORS, можешь показать этот код? Поиск нужных координат нужно. А посылка сообщения игре в данном случае не поможет - там надо именно мышкой водить, чтобы бриллианты собирать. А то пальцы на тачпаде протру скоро
Ответить с цитированием
  #24  
Старый 28.08.2013, 12:34
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию

Кидаешь на форму 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  
Старый 28.08.2013, 14:55
Аватар для Speech
Speech Speech вне форума
Новичок
 
Регистрация: 16.02.2012
Сообщения: 55
Репутация: 10
По умолчанию

SCrat.ORS, вот спасибо так спасибо
Цитата:
Сообщение от SCrat.ORS
но помним, что если нашёл координаты нужного пикселя, то его координаты будут относительно bmp(окна) а не начала экрана. т.е
0 в bmp - это HwndRect.left/top на экране.
Помним помним - именно потому я делал расположение формы (и TImage) и ее размеры равными разрешению экрана Простой и эффективный способ ))
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:21.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter