Russian Qt Forum
Ноябрь 24, 2024, 07:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Скриншот области которая находится под окном  (Прочитано 7291 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Июнь 24, 2014, 17:15 »

Возможно задача покажется странной, но ее нужно сделать Улыбающийся Суть такая, есть окно, которое всегда находится поверх других окон. Нужно получить скриншот области которая находится под этим окном. Это может быть все что угодно, браузер, проводник или просто рабочий стол.

Я пробовал получать HWND окна которое находится сразу под моим и передавать его в grabWindow. Это работает, но частично. Например в Google chrome изображение отдается просто черным квадратом, в Firefox белым в Опере тоже черным. В приложения написанных на qml тоже отдается просто черный квадрат. Кто знает есть ли еще способы получить скриншот окна ?

Код:
QScreen *screen = QGuiApplication::primaryScreen();
screen->grabWindow(0, .....);


не катит, т.к. получит снимок всей области, а на ней может быть, что то нарисовано.
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Июнь 25, 2014, 09:48 »

Эти окна не грабятся потому, что они используют для отрисовки directx или opengl, так что тебе надо научиться их отдельно грабить так, как это делает, например, fraps.
Записан

Гугль в помощь
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 25, 2014, 11:06 »

Делал через glReadPixels (окно правда было свое). Потом с огромным удовольствием избавился от этого кода.  Ну "кто-то теряет - кто-то находит"  Улыбающийся
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Июнь 25, 2014, 12:49 »

Тоже грешил на direcX. Сначала попробовал написать exaple сам, естественно ничего не заработало  Улыбающийся Потом нашел хороший пример в сети. С ним скриншот работает, но он тоже снимает весь десктоп, даже если ему передавать HWND конкретного окна, он все равно снимает полностью десктоп.
Записан
Bepec
Гость
« Ответ #4 : Июнь 25, 2014, 12:59 »

Давайте нам хороший пример, всем думаю интересно Улыбающийся
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #5 : Июнь 25, 2014, 13:16 »

Вот http://joxi.ru/KqGqUxjKTJAzH2zSxyU

Насколько понял в WM_CREATE, в функцию GetDC можно подставлять свой хэндл окна. Но чет у меня это не сработало, все равно грабит весь экран.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #6 : Июнь 25, 2014, 13:21 »

В InitD3D тоже передавал разные хэндлы.
Записан
AlexEx
Чайник
*
Offline Offline

Сообщений: 76


Просмотр профиля
« Ответ #7 : Июнь 28, 2014, 19:47 »

IMHO сделать такое в общем случае просто невозможно, ибо картинки той части окна, которая лежит под другим окном, просто не не существует. При, например, перемещении верхнего окна нижнее просто получает сообщение WM_PAINT и перерисовывает открывшуюся область. Некоторые программы, конечно, рисуют окно из своего внутреннего битмапа, т.е. картинка есть, но это вряд ли поможет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июнь 29, 2014, 11:16 »

На Вындоуз в общем случае недостижимо т.к. (double) буфера нет, т.е. рисуется прямо в видео, перекрыто - все. Как уже сказали многие приложения кешируют, но это уже их личное дело, внутренний буфер никто не даст.
Записан
Bepec
Гость
« Ответ #9 : Июнь 29, 2014, 12:29 »

Ну всегда есть выход, если очень надо.
К примеру выводить наверх, делать скриншот, прятать обратно.
Или же виртуальный дисплей, на который переносить окно, скриншотить и обратно тягать.
Ну и совсем изврат - форкать процесс и по предыдущему варианту Веселый
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Июнь 29, 2014, 20:02 »

Есть программа грабер экрана, в нём можно выделить область и сграбить только её.
Делал её Артём, DOOMer
http://screengrab.doomer.org/ru/

Капай её код
Записан

Юра.
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #11 : Июнь 30, 2014, 23:21 »

Код:
Есть программа грабер экрана, в нём можно выделить область и сграбить только её.
Делал её Артём, DOOMer
http://screengrab.doomer.org/ru/

Капай её код

Не прокатило, она скрывает свое окно, делает снимок и возвращает окно. При этом если включен aero то видны следы окна на скрине. А мне снимки нужно делать 20 раз в секунду Улыбающийся
Всем спасибо, решил проблему по другому. Просто ограничил размер выделенной области и запретил на ней рисовать всякое.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.