|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
"Чистое" изображение чужой формы
Здравствуйте, уважаемые форумчане!
(Это дополнение к моему недавнему вопросу в этом разделе форума) Мне нужно получить снимок с окна другой программы, чтобы потом обрабатывать это изображение в своей. Я делал как: получал контекст устройства (DC) чужой формы, в своей программе создавал объект TBitmap, затем с помощью функции BitBlt копировал в свой TBitmap изображение с контекста этой чужой формы. Но проблема в том, что если чужая форма перекрыта окнами других приложений, изображение получается "грязное", то есть в нем я получаю также снимки перекрывающих форм. Мне этого не надо. Знаю, что в классе TForm есть метод GetFormImage, а так же метод PainTo. Вопрос такой: можно ли создать объект TForm, привязанный к любому произвольно выбранному окну и его инкапсулирующий, с тем, чтобы я мог использовать один из вышеуказанных методов для получения "чистого" снимка формы? Если да, то как это делается? P.S. Я заглядывал в исходник PaintTo. Можно было бы в лоб использовать последовательность вызовов Win32 API из него, но мне хочется как-то по простому, хотя вроде, как написано там, так и несложно. В любом случае, привязка TForm к произвольной форме могла бы пригодиться в дальнейшем и для других задач. С уважением, Дмитрий Новиков |
#2
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ |
#3
|
|||
|
|||
С некоторыми ограничениями можно получить скриншот перекрытого окна с помощью функции PrintWindow.
|
#4
|
|||
|
|||
А как мне получить доступ к PrintWindow? У меня Delphi 7, в Windows.pas этой функции еще нет.
|
#5
|
||||
|
||||
Код:
... function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: Cardinal): Boolean; stdcall external user32; implementation ... Пишу программы за еду. __________________ |
#6
|
|||
|
|||
Тогда вопрос такой. Мне нужно получить скриншот клиентской части окна. Насколько я понял, для этого надо вызывать PrintWindow с флагом PW_CLIENTONLY, и тогда вызывается сообщение для нужного мне окна WM_PRINTCLIENT. Но в документации я прочитал, что оно не обрабатывается, в отличие от WM_PRINT, автоматически с помощью DefWindowProc, программист должен написать свой обработчик этого сообщения. Кажется, программист, разработавший нужное окно, это сделал, но коряво, так что с флагом PW_CLIENTONLY номер не проходит. Получается, что мне доступно только целиковое изображение нужного мне окна с рамкой и заголовком. Вопрос такой: как мне отсечь из получаемого мной изображения именно клиентскую область? то есть, мне нужно смещение клиентской области окна относительно неклиентской. В Win32 API я подходящей функции я не знаю. Как мне быть?
|
#7
|
||||
|
||||
Слушай, а зачем вообще те все это ? Т.е. что за программу ты пишешь для которой нужен скриншот чужой проги ?
ЗЫ А вообще ты можешь сперва вывести окно на передний план, а потом уже сделать скриншот. В идеале потом можешь вернуть обратно окошко на задний план) |
#8
|
||||
|
||||
GetClientRect / GetWindowRect ?
Пишу программы за еду. __________________ |
#9
|
|||
|
|||
Ну какая Вам, извините, разница, что у меня за программа? На форумах многие задают вопросы, ища помощи и не уточняя, что за софтину они пишут, а только какая задача перед ними стоит, которую они решить пока не в силах. Скриншот клиентской области программы мне нужен для некоторой специальной обработки, а какой именно - уж это я умолчу.
А выдвигать нужное мне окно на передний план и затем задвигать его обратно - не пойдет, некомильфо. Я ж знаю, что можно снимок корректный получить и без этого. Теперь передо мной стоит вопрос, как мне из него выделить именно клиентскую часть окна. |