Задать вопрос
@pmtqw1

Отрисовка наложений в windows?

Делаю один проект на c++ и возникала такая проблема, мне нужно рисовать наложение в окне windows которое я получаю по его имени и всё работает, но при перерисовке окна моё наложение пропадает можно ли сделать моё наложение частью окна ?
  • Вопрос задан
  • 180 просмотров
Подписаться 1 Средний 1 комментарий
Решения вопроса 4
TrueBers
@TrueBers
Гуглю за еду
Вижу единственный вариант наложения: ты наложил на гугл и изучение информации. С девяностых годов оверлеи люди рисовали и обсуждали на форумах, было бы желание изучать, да? А без него никак не получится.

Фундаментально есть 4+ мне известных пути:
1. Рисовать на контексте устройства напрямую, как, походу, ты и рисуешь. Это самый простой и самый кривой метод. Всё будет мерцать, пропадать. Всё равно придётся как-то синхронизироваться с V-blank, чтобы не выглядело ублюдски и не жрало ядра процессора брутфорсным рендерингом не в попад.
2. Чуть менее простой и более-менее работающий способ, как уже сказали: создаёшь topmost-layered-transparent окно, ставишь хуки ресайза и перемещения на окно целевого приложения, рисуешь в контекст своего окна, что душе угодно. Иногда могут быть проблемы, если кто-то в эксклюзивном режиме композитора решит, что он более topmost, чем твоё окно. В целом, самый адекватный вариант без хаков.

Хаки
3. Инжектиться в сам процесс, выковыривать момент свапа буферов или представления единственного буфера, рендерить туда в момент перед самым представлением. Это может быть GDI, GDI+, Direct2D, DirectX, OpenGL, Vulkan.
Можно также заинжектиться в композитор, если он используется. Потом точно так же откопать момент свапчейна и рендерить на уровне композитора. Там можно будет скрываться от скриншотов и ещё много чего делать.
При желании и нехилом опыте, можно очень даже стабильно и красиво всё делать.
4. Заабьюзить устаревшее API экранной лупы. Где-то были POC'и, что через неё можно вполне годный оверлей сделать. Но придётся повоевать с композитором, либо вообще его отключить. И вообще, хз, работает ли это в современных виндах. Последний раз такие хаки видел в Семёрке.
Ответ написан
Комментировать
VoidVolker
@VoidVolker Куратор тега Windows
Dark side eye. А у нас печеньки! А у вас?
можно ли сделать моё наложение частью окна

Только со стороны механизма рендеринга окна. Если у этого окна есть свой кастомный рендер контента, конечно. Если это простое системное окно - то нельзя.
Ответ написан
Комментировать
veselov4nton
@veselov4nton
Системный администратор.
Если ты хочешь встраивать отрисовку в чужое окно, то:

Получаешь HWND по имени окна (FindWindow)
Ставишь hook (SetWindowLong / SetWindowSubclass) на обработку сообщений
На WM_PAINT вызываешь свою отрисовку (например, через GDI, GDI+, Direct2D)
Минус: нельзя влезть в чужой процесс без DLL-инъекции, если это не твоё окно.
Ответ написан
Комментировать
@rPman
Настоятельно рекомендую вместо сложного встраивания в логику отображения, разместить поверх окна свое, с прозрачностью, двигать окно параллельно и отрисовывать только там где это необходимо

Из неудобств - необходимость отслеживать z-order окон, что бы корректно перекрывать только нужное окно
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы