|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
Ну какая Вам, извините, разница, что у меня за программа? На форумах многие задают вопросы, ища помощи и не уточняя, что за софтину они пишут, а только какая задача перед ними стоит, которую они решить пока не в силах. Скриншот клиентской области программы мне нужен для некоторой специальной обработки, а какой именно - уж это я умолчу.
А выдвигать нужное мне окно на передний план и затем задвигать его обратно - не пойдет, некомильфо. Я ж знаю, что можно снимок корректный получить и без этого. Теперь передо мной стоит вопрос, как мне из него выделить именно клиентскую часть окна. |
#10
|
|||
|
|||
NumLock, я знаю эти функции, и они мне не помогут. GetWindowRect вернет мне размеры и позицию всего окна. А GetClientRect - только размеры неклиентской области окна. А мне нужно кроме этого смещение клиентской области относительно неклиентской.
|
#11
|
||||
|
||||
Код:
The GetClientRect function retrieves the coordinates of a window's client area. Код:
var rct: TRect; TopLeft: TPoint; begin Windows.GetClientRect(Handle, rct); TopLeft.X:=0; TopLeft.Y:=0; Windows.ClientToScreen(Handle, TopLeft); rct.Left:=rct.Left+TopLeft.X; rct.Top:=rct.Top+TopLeft.Y; rct.Right:=rct.Right+TopLeft.X; rct.Bottom:=rct.Bottom+TopLeft.Y; Memo1.Lines.Add('--GetClientRect--'); Memo1.Lines.Add(IntToStr(rct.Left)); Memo1.Lines.Add(IntToStr(rct.Top)); Memo1.Lines.Add(IntToStr(rct.Right)); Memo1.Lines.Add(IntToStr(rct.Bottom)); Windows.GetWindowRect(Handle, rct); Memo1.Lines.Add('--GetWindowRect--'); Memo1.Lines.Add(IntToStr(rct.Left)); Memo1.Lines.Add(IntToStr(rct.Top)); Memo1.Lines.Add(IntToStr(rct.Right)); Memo1.Lines.Add(IntToStr(rct.Bottom)); end; Пишу программы за еду. __________________ |
#12
|
|||
|
|||
А, все, понял. То есть если мы прибавляем к координатам, получаемым функцией GetClientRect, абсолютные координаты левой верхней точки клиентской области, то мы получаем абсолютные координаты этой клиентской области. Тогда вычитая из полученных координат координаты всего окна, мы получаем то самое смещение. Спасибо!
Последний раз редактировалось Homez, 11.04.2011 в 17:50. |