|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Координаты в окне и во весь экран не совпадают
Здравствуйте!
Делаю бота для игры. Получаю координаты пикселя следующим образом: Код:
.. 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
|
|||
|
|||
ClientToScreen и ScreenToClient спасут отца русской демократии.
На свмом деле, когда ты у окна получаешь точку, то ты получаешь ее в системе координат окна. Частный случай, когда окно развернуто во весь экран, системы координат окна и всего экрана просто совпадают. |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Alloc (08.10.2015)
|
#3
|
||||
|
||||
Цитата:
спасибо за помощь) |
#4
|
||||
|
||||
Цитата:
что то не получается у меня разобраться.. Скажите пожалуйста, в моем конкретном случае как это сделать? |
#5
|
|||
|
|||
Т.к. ты работаешь с чужим окном, то получи его положение и, соответственно, пересчитай свои координаты. Просто для "родных" окон у VCL есть готовый метод пересчета, а для чужих придется самому все делать (там еще, возможно, потребуется получить размер рамки и его тоже учесть в перерасчетах).
|
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Alloc (08.10.2015)
|
#6
|
||||
|
||||
Спасибо за ответ.
Я так понимаю в момент выполнения функции: Код:
Windows.ClientToScreen(h1,Point); |
#7
|
||||
|
||||
Где в описании хоть что-то про активность окна? Она ж просто берет твою точку и прибавляет к ней левый верхний угол заданного окна.
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Alloc (09.10.2015)
|
#8
|
||||
|
||||
Цитата:
в том то и дело, что я то же не нашел, но если я задам координаты и вызову это функцию находясь в окне программы а не в окне игры: Код:
Point.X:=685; Point.Y:=486; Windows.ClientToScreen(h1,Point); то получу неверные координаты такого типа: "-31315, -31514"... а если в окне игры то все нормально. |
#9
|
||||
|
||||
А что такое h1?
jmp $ ; Happy End! The Cake Is A Lie. |
#10
|
||||
|
||||
Цитата:
ну как, хэндл.. |
#11
|
||||
|
||||
Хендл чего? Где и как он получается? Также, как и в 1 посте?
Кстати, не ясно, зачем в 1 посте 2 раза FindWindow. jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Alloc (09.10.2015)
|
#12
|
||||
|
||||
Цитата:
Да, так же как и в первом посте. А два раза вызываю FindWindow, потому что по другому не работает почему то... Я понимаю, что можно было бы сделать просто: Код:
h1 := FindWindow(ProgName, nil); DC := GetDC(h1); но дальше проверка цвета пикселя не срабатывает... ну а так работает почему то... Но вопрос не в этом.. |
#13
|
||||
|
||||
1) Ты заметил, что у тебя разные параметры в этих двух FindWindow?
2) Ты уверен, что искать нужно именно по первому параметру, т.е. имени класса, а не имени окна? Если "дальше проверка пикселя не срабатывает", то вопрос как раз-таки в этом. В том, что h1 имеет ошибочное значение. Посмотри в отладчике, чему равно h1. jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Alloc (11.10.2015)
|