Опять проблема совместимости.. GetWindowRect() + GetPixel()
прикрепляться к процессу, получать hwnd главного окна, его размер (через GetWindowRect()) и затем считывать цвет пикселя по определённой координате.
Загвоздка в том, что у всех размер окна программы (это игра) разное. Поэтому точка, цвет которой мне надо получить, имеет разную координату в зависимости от разрешения (размера) окна игры. Я решил эту проблему чисто математически:
Если у меня GetWindowRect() возвращает ширину и высоту окна 800 и 600, а нужная точка при данном разрешении имеет координату 200 и 150, тогда чтобы получить координаты этой же точки на другом разрешении (например 1024х768), мы должны заюзать такую пропорцию: X = (1024 / (800 / 200)). Также для Y. Разумеется, не без погрешности, но если быть точным, меня интересует небольшая область точек, а не какая-то конкретная.
Так вот, у меня на компьютере это работает отменно.. т.е. меняю разрешения и точка считывается именно та, которая нужна мне (из нужной области, вернее). Но на некоторых других компьютерах получаю следующее:
программа выводит ширину и высоту окна на экран (полученную через GetWindowRect()) - 1024 на 768. А считанный цвет пикселя: 255, 255, 255 (RGB)
На сколько вам известно, это белый цвет. Его ДАЖЕ БЛИЗКО с нужно точкой нет. Соответственно, то ли он считывается где-то за пределами области окна, то ли вообще не понимаю откуда берётся этот цвет..
И самое интересное, что ошибка возникает на разных компьютерах, но с идентичными разрешениями (и экрана и окна программы). Вопрос заключается в том, как мне отловить ошибку и где она может быть? Есть ли какие-то ограничения у GetPixel()?
эм, пока писал, сообразил. А если в GetPixel будут переданы дробные координаты, она корректно отработает?
Ты представляешь себе дробный пиксел? Игра GDI?
Эта функция может возвратить ошибку CLR_INVALID (0xffffffff), что скорее всего и происходит, а не белый цвет 0x00ffffff.
Цитата: Phodopus
Ты представляешь себе дробный пиксел? Игра GDI?
Эм, а как определить?)
Цитата: grag63
GetPixel имеет вх. параметры как int, соотв. твои дроби преобр. к целому.
Эта функция может возвратить ошибку CLR_INVALID (0xffffffff), что скорее всего и происходит, а не белый цвет 0x00ffffff.
Эта функция может возвратить ошибку CLR_INVALID (0xffffffff), что скорее всего и происходит, а не белый цвет 0x00ffffff.
По входным - согласен.. по ошибке - тоже. Тогда другой вопрос: почему эта ошибка может возникать?