|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | 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  
			
			
			
			
		 | |||
| 
 | |||
|   Ну какая Вам, извините, разница, что у меня за программа? На форумах многие задают вопросы, ища помощи и не уточняя, что за софтину они пишут, а только какая задача перед ними стоит, которую они решить пока не в силах. Скриншот клиентской области программы мне нужен для некоторой специальной обработки, а какой именно - уж это я умолчу. А выдвигать нужное мне окно на передний план и затем задвигать его обратно - не пойдет, некомильфо. Я ж знаю, что можно снимок корректный получить и без этого. Теперь передо мной стоит вопрос, как мне из него выделить именно клиентскую часть окна. |