GetPixel возвращает неверные значения

Это мое первое сообщение на этом форуме, пожалуйста, не усердствуйте, если я не разместил его в нужном месте или если я что-то сделал не так, я не очень много пишу на форумах. Итак, у меня есть эта проблема с функцией GetPixel. По сути, он должен вернуть десятичный цвет в точке x, y. Код, который я собираюсь опубликовать, прекрасно работает на Windows 7 32bit, но недавно я купил новый ноутбук y50-70 с Windows 8.1 64bit, и тот же код работает совершенно по-другому. Я не могу найти решение проблемы, даже не могу ее описать. Я думаю, что это может быть связано с дескриптором десктопа, HDC, GetDC (), GetPixel (), возможно, даже с разрешением моего компьютера, частотой обновления или чем-то подобным … Я даже записал несколько видео, которые могли бы помочь вам понять У меня проблема, потому что я даже не могу описать это правильно. Это похоже на реальный цвет x = 219, y = 407 от того места, куда указывает моя мышь. Новому ноутбуку 3 недели, я даже пытался восстановить систему 1 раз, но это не решило проблему.

Не стесняйтесь использовать этот код, надеюсь, он будет работать нормально для вас:

#include <iostream>
#include <Windows.h>
using namespace std;

void Detect();

int main()
{
Detect();

return 0;
}

void Detect()
{
POINT p;
HDC hDC = GetDC(0);
int x, y;

while (!GetAsyncKeyState(VK_INSERT)) // Press insert to stop
{
GetCursorPos(&p);
x = p.x;
y = p.y;
hDC = GetDC(0);
cout << x << " " << y << " " << GetPixel(hDC, x, y) << endl;
Sleep(50);
}
ReleaseDC(0, hDC);
}

Ссылки на проблему ниже:
https://youtu.be/q2H2M8WLHVI
https://youtu.be/UcneHwXaGoM

Если бы кто-нибудь мог хоть как-то помочь или сказать, что делать, куда идти, я бы очень, очень оценил это. Одна из главных причин, по которой я начал программировать, заключается в том, что что-то вроде этого, работа с цветами, условиями и т. Д. … и теперь я не могу продвигаться дальше, что действительно печально. Надеюсь услышать ответ. Спасибо.

2

Решение

Это, вероятно, проблема с масштабированием DPI.

Если у вашего нового монитора число точек на дюйм выше среднего, Windows по умолчанию будет растягивать графику. По умолчанию Windows предполагает, что программы игнорируют DPI. Если Windows не растягивает графику, то программы, которые не настраивают на DPI, будут иметь крошечный текст в крошечных окнах на дисплеях высокой плотности.

Это немного взломать. Некоторые из API-интерфейсов и сообщений Windows, которые позволяют вам спрашивать об отображении и окнах, будут переводить координаты между «средним» 96 пикселями на дюйм и любым фактическим значением DPI для монитора. Аналогично, API-интерфейсы, позволяющие измерять размер, выполняют противоположное преобразование. Так что все это в значительной степени прозрачно для программы. Но это не идеально, потому что не все API могут выполнять масштабирование согласованным образом.

Поэтому я предполагаю, что ваш ноутбук оснащен дисплеем с высоким разрешением, GetPixel не переводит координаты для масштабирования DPI и положение мыши. является преобразован для масштабирования DPI. В результате вы запрашиваете пиксель, который на самом деле не совпадает с мышью.

Мое предлагаемое решение — сообщить окнам, что ваша программа «поддерживает DPI». Есть несколько способов сделать это. Самый простой в вашем случае может быть позвонить SetProcessDPIAware в самом начале вашей программы. Вы также можете сделать это, отметив вашу программу в манифесте. В зависимости от используемого компилятора может быть опция командной строки для автоматического создания необходимого манифеста.

3

Другие решения

Другая альтернатива, которая сработала для меня, это изменить настройку в панели управления, чтобы отключить масштабирование DPI для каждого устройства. Вы используете несколько мониторов?

В Win 8.1 появился новый параметр в панели управления, который говорит: «Позвольте мне выбрать один масштаб DPI для все отображает «. По умолчанию это отключено. Включение сработало для меня.

Посмотрите это видео, чтобы найти настройки:
https://www.youtube.com/watch?v=sE3IUTPy1WA

Мне любопытно, поэтому дайте мне знать, если это работает для вас, когда вы не используете SetProccesDPIAware()

0

По вопросам рекламы [email protected]