Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 03.10.2020
Сообщений: 4

Почему GetPixelColor работает некорректно при масштабе в 125%?

03.10.2020, 14:58. Показов 771. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте. Уже неделю не могу решить одну задачу, и уже не знаю куда обратиться.

Пишу бота для одной игры. Функция его проста, отслеживать красную точку в игре по одним и тем же координатам, и нажимать, когда нужно. И все прекрасно работает, но только если масштаб пользователя установлен на 100%. Но как только масштаб меняется, позиции плывут.

Было разрашение 1920x1080, стало 1536x864.
Я пробовал координаты менять по отношению к масштабу, и что самое интересное, оно работало, но очень странно. Если я нахожусь в игре, ничего не работает. GetPixelColor возвращает просто черный цвет, одни нули (rgb). Но если я сверну в фон игру, то все работает. И меня это ввело в ступор. Знание языка у меня очень мало, и я не понимаю почему так происходит.

Подскажите, как можно это исправить, и куда копать? В стандартном режиме, когда масштаб 100%, все ок. И в фоне работает отлично.

Разрешение монитора 1920x1080.
Разрешение в игре 1920x1080.
Позиция точки 1200x600.

После изменения масштаба в 125% и выше координаты меняются и функция перестает корректном работать.


Вот код функции. Он запускается в winform через таймер раз в секунду.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hwnd);
 
[DllImport("user32.dll")]
static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);
 
[DllImport("gdi32.dll")]
static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);
 
static public int[] GetPixelRGB(int x, int y)
{
  IntPtr hdc = GetDC(hWnd);
  uint pixel = GetPixel(hdc, x, y);
  ReleaseDC(IntPtr.Zero, hdc);
  return new int[3] { (int)(pixel & 0x000000FF), (int)(pixel & 0x0000FF00) >> 8, (int)(pixel & 0x00FF0000) >> 16 };
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.10.2020, 14:58
Ответы с готовыми решениями:

Почему поворот работает некорректно?
Собственно, прилагаю весь проект. В целом все работает, а вот поворот...Очень прошу помощи.

Определить почему программа работает некорректно
Программа вне зависимости от того, что вводить с клавиатуры выводит на экран "ночь". #include <iostream> using...

Почему преобразование фунтов в дюймы работает некорректно?
Решаю задания по учебнику Прата и наткнулся на задание преобразовать футы в дюймы, но почему-то преобразование происходит некорректно и...

4
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.10.2020, 15:48
Цитата Сообщение от onatskyi Посмотреть сообщение
После изменения масштаба в 125% и выше координаты меняются и функция перестает корректном работать.
Возможно, это происходит потому, что твоя программа не включает DPI aware
Setting the default DPI awareness for a process
0
0 / 0 / 0
Регистрация: 03.10.2020
Сообщений: 4
03.10.2020, 16:30  [ТС]
В манифесете вот что указано:

Добавлено через 1 минуту
XML
1
2
3
4
5
6
7
    <asmv3:application>
        <asmv3:windowsSettings>
            <gdiScaling xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">false</gdiScaling>
            <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True</dpiAware>
            <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,permonitor</dpiAwareness>
        </asmv3:windowsSettings>
    </asmv3:application>
Добавлено через 2 минуты
Функция GetPixel возвращает 0,0,0 - если игра открыта. И если игра в фоне, то 255,255,255
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
03.10.2020, 16:32
Цитата Сообщение от onatskyi Посмотреть сообщение
В манифесете вот что указано:
Попробуй что-то поменять здесь - выставить gdiScaling в true, или отключить dpi aware вообще

Добавлено через 1 минуту
Цитата Сообщение от onatskyi Посмотреть сообщение
И если игра в фоне, то 255,255,255
Похоже на CLR_INVALID
0
0 / 0 / 0
Регистрация: 03.10.2020
Сообщений: 4
03.10.2020, 17:39  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Похоже на CLR_INVALID
Не знаете как это исправить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.10.2020, 17:39
Помогаю со студенческими работами здесь

Не могу понять почему программа работает некорректно (односвязные списки)
Построить однонаправленный список чисел. Затем исключить из него все повторы чисел, оставить каждое число в списке в единственном...

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

Функция работает некорректно, при компиляции x32
Если компилировать в x64 результат верный. char* get_name(long hwnd, long index) { LVITEM lvi, *_lvi; char item; char *_item; ...

Программа работает некорректно при запуске из *.exe
Появилось весьма интересная проблема: при запуске моей программы из *.exe-файла она работает некорректно (некоторые из используемых флажков...

USB-модем некорректно работает при разгоне
проц intel pentium d915 видеокарта gf7600gs мать не помню бп на 500 ватт(китай) Суть вопроса в следующем через биос увеличиваю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru