Russian Qt Forum

Qt => Общие вопросы => Тема начата: ecspertiza от Июнь 24, 2014, 17:15



Название: Скриншот области которая находится под окном
Отправлено: ecspertiza от Июнь 24, 2014, 17:15
Возможно задача покажется странной, но ее нужно сделать :) Суть такая, есть окно, которое всегда находится поверх других окон. Нужно получить скриншот области которая находится под этим окном. Это может быть все что угодно, браузер, проводник или просто рабочий стол.

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

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


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


Название: Re: Скриншот области которая находится под окном
Отправлено: navrocky от Июнь 25, 2014, 09:48
Эти окна не грабятся потому, что они используют для отрисовки directx или opengl, так что тебе надо научиться их отдельно грабить так, как это делает, например, fraps.


Название: Re: Скриншот области которая находится под окном
Отправлено: Igors от Июнь 25, 2014, 11:06
Делал через glReadPixels (окно правда было свое). Потом с огромным удовольствием избавился от этого кода.  Ну "кто-то теряет - кто-то находит"  :)


Название: Re: Скриншот области которая находится под окном
Отправлено: ecspertiza от Июнь 25, 2014, 12:49
Тоже грешил на direcX. Сначала попробовал написать exaple сам, естественно ничего не заработало  :) Потом нашел хороший пример в сети. С ним скриншот работает, но он тоже снимает весь десктоп, даже если ему передавать HWND конкретного окна, он все равно снимает полностью десктоп.


Название: Re: Скриншот области которая находится под окном
Отправлено: Bepec от Июнь 25, 2014, 12:59
Давайте нам хороший пример, всем думаю интересно :)


Название: Re: Скриншот области которая находится под окном
Отправлено: ecspertiza от Июнь 25, 2014, 13:16
Вот http://joxi.ru/KqGqUxjKTJAzH2zSxyU

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


Название: Re: Скриншот области которая находится под окном
Отправлено: ecspertiza от Июнь 25, 2014, 13:21
В InitD3D тоже передавал разные хэндлы.


Название: Re: Скриншот области которая находится под окном
Отправлено: AlexEx от Июнь 28, 2014, 19:47
IMHO сделать такое в общем случае просто невозможно, ибо картинки той части окна, которая лежит под другим окном, просто не не существует. При, например, перемещении верхнего окна нижнее просто получает сообщение WM_PAINT и перерисовывает открывшуюся область. Некоторые программы, конечно, рисуют окно из своего внутреннего битмапа, т.е. картинка есть, но это вряд ли поможет.


Название: Re: Скриншот области которая находится под окном
Отправлено: Igors от Июнь 29, 2014, 11:16
На Вындоуз в общем случае недостижимо т.к. (double) буфера нет, т.е. рисуется прямо в видео, перекрыто - все. Как уже сказали многие приложения кешируют, но это уже их личное дело, внутренний буфер никто не даст.


Название: Re: Скриншот области которая находится под окном
Отправлено: Bepec от Июнь 29, 2014, 12:29
Ну всегда есть выход, если очень надо.
К примеру выводить наверх, делать скриншот, прятать обратно.
Или же виртуальный дисплей, на который переносить окно, скриншотить и обратно тягать.
Ну и совсем изврат - форкать процесс и по предыдущему варианту :D


Название: Re: Скриншот области которая находится под окном
Отправлено: lit-uriy от Июнь 29, 2014, 20:02
Есть программа грабер экрана, в нём можно выделить область и сграбить только её.
Делал её Артём, DOOMer
http://screengrab.doomer.org/ru/

Капай её код


Название: Re: Скриншот области которая находится под окном
Отправлено: ecspertiza от Июнь 30, 2014, 23:21
Код:
Есть программа грабер экрана, в нём можно выделить область и сграбить только её.
Делал её Артём, DOOMer
http://screengrab.doomer.org/ru/

Капай её код

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