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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.10.2015, 01:37
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Координаты в окне и во весь экран не совпадают

Здравствуйте!

Делаю бота для игры. Получаю координаты пикселя следующим образом:

Код:
..
var
  r,g,b: Integer;
  PointColor: TColor;
  PointX,PointY: Integer;
begin
  PointX:=685;
  PointY:=486;
 
  h1 := FindWindow(ProgName, nil);
  DC := GetDC(FindWindow(ProgName,''));

  PointColor:= GetPixel(DC,PointX,PointY);
  r:=GetRValue(PointColor);
  g:=GetGValue(PointColor);
  b:=GetBValue(PointColor);

// дальше идет сравнение цвета пикселя и если есть совпадение передаем нажатие кнопки.

Проблема в том, что если игра установлена на весь экран с разрешением 1024х768 все срабатывает, а если поставить в оконном режиме с тем же разрешением - нет...

что я делаю не так? Заранее спасибо.

Последний раз редактировалось Alloc, 08.10.2015 в 14:49.
Ответить с цитированием
  #2  
Старый 08.10.2015, 06:26
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ClientToScreen и ScreenToClient спасут отца русской демократии.

На свмом деле, когда ты у окна получаешь точку, то ты получаешь ее в системе координат окна. Частный случай, когда окно развернуто во весь экран, системы координат окна и всего экрана просто совпадают.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Alloc (08.10.2015)
  #3  
Старый 08.10.2015, 12:01
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
ClientToScreen и ScreenToClient спасут отца русской демократии.

спасибо за помощь)
Ответить с цитированием
  #4  
Старый 08.10.2015, 14:52
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
ClientToScreen и ScreenToClient спасут отца русской демократии.

что то не получается у меня разобраться.. Скажите пожалуйста, в моем конкретном случае как это сделать?
Ответить с цитированием
  #5  
Старый 08.10.2015, 19:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Т.к. ты работаешь с чужим окном, то получи его положение и, соответственно, пересчитай свои координаты. Просто для "родных" окон у VCL есть готовый метод пересчета, а для чужих придется самому все делать (там еще, возможно, потребуется получить размер рамки и его тоже учесть в перерасчетах).
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Alloc (08.10.2015)
  #6  
Старый 08.10.2015, 22:46
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо за ответ.

Я так понимаю в момент выполнения функции:
Код:
Windows.ClientToScreen(h1,Point);
нужное окно должно быть активно? А если нет? Можно с этим как то бороться?
Ответить с цитированием
  #7  
Старый 08.10.2015, 23:53
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Где в описании хоть что-то про активность окна? Она ж просто берет твою точку и прибавляет к ней левый верхний угол заданного окна.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Alloc (09.10.2015)
  #8  
Старый 09.10.2015, 01:19
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Где в описании хоть что-то про активность окна? Она ж просто берет твою точку и прибавляет к ней левый верхний угол заданного окна.

в том то и дело, что я то же не нашел, но если я задам координаты и вызову это функцию находясь в окне программы а не в окне игры:
Код:
Point.X:=685;
Point.Y:=486;
Windows.ClientToScreen(h1,Point);

то получу неверные координаты такого типа: "-31315, -31514"... а если в окне игры то все нормально.
Ответить с цитированием
  #9  
Старый 09.10.2015, 14:56
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

А что такое h1?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #10  
Старый 09.10.2015, 15:49
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
А что такое h1?

ну как, хэндл..
Ответить с цитированием
  #11  
Старый 09.10.2015, 16:27
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Хендл чего? Где и как он получается? Также, как и в 1 посте?
Кстати, не ясно, зачем в 1 посте 2 раза FindWindow.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Alloc (09.10.2015)
  #12  
Старый 09.10.2015, 17:39
Аватар для Alloc
Alloc Alloc вне форума
Начинающий
 
Регистрация: 17.09.2014
Сообщения: 104
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Хендл чего? Где и как он получается? Также, как и в 1 посте?
Кстати, не ясно, зачем в 1 посте 2 раза FindWindow.

Да, так же как и в первом посте. А два раза вызываю FindWindow, потому что по другому не работает почему то...

Я понимаю, что можно было бы сделать просто:
Код:
  h1 := FindWindow(ProgName, nil);
  DC := GetDC(h1);

но дальше проверка цвета пикселя не срабатывает... ну а так работает почему то...

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

1) Ты заметил, что у тебя разные параметры в этих двух FindWindow?
2) Ты уверен, что искать нужно именно по первому параметру, т.е. имени класса, а не имени окна?
Если "дальше проверка пикселя не срабатывает", то вопрос как раз-таки в этом. В том, что h1 имеет ошибочное значение. Посмотри в отладчике, чему равно h1.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Alloc (11.10.2015)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter