Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.04.2011, 01:10
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию "Чистое" изображение чужой формы

Здравствуйте, уважаемые форумчане!

(Это дополнение к моему недавнему вопросу в этом разделе форума)

Мне нужно получить снимок с окна другой программы, чтобы потом обрабатывать это изображение в своей. Я делал как: получал контекст устройства (DC) чужой формы, в своей программе создавал объект TBitmap, затем с помощью функции BitBlt копировал в свой TBitmap изображение с контекста этой чужой формы. Но проблема в том, что если чужая форма перекрыта окнами других приложений, изображение получается "грязное", то есть в нем я получаю также снимки перекрывающих форм. Мне этого не надо.

Знаю, что в классе TForm есть метод GetFormImage, а так же метод PainTo. Вопрос такой: можно ли создать объект TForm, привязанный к любому произвольно выбранному окну и его инкапсулирующий, с тем, чтобы я мог использовать один из вышеуказанных методов для получения "чистого" снимка формы? Если да, то как это делается?

P.S. Я заглядывал в исходник PaintTo. Можно было бы в лоб использовать последовательность вызовов Win32 API из него, но мне хочется как-то по простому, хотя вроде, как написано там, так и несложно. В любом случае, привязка TForm к произвольной форме могла бы пригодиться в дальнейшем и для других задач.

С уважением, Дмитрий Новиков
Ответить с цитированием
  #2  
Старый 11.04.2011, 11:40
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Homez
Вопрос такой: можно ли создать объект TForm, привязанный к любому произвольно выбранному окну и его инкапсулирующий, с тем, чтобы я мог использовать один из вышеуказанных методов для получения "чистого" снимка формы?
нет.......
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 11.04.2011, 13:06
x128 x128 вне форума
Новичок
 
Регистрация: 03.02.2010
Сообщения: 64
Репутация: 133
По умолчанию

С некоторыми ограничениями можно получить скриншот перекрытого окна с помощью функции PrintWindow.
Ответить с цитированием
  #4  
Старый 11.04.2011, 14:42
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

А как мне получить доступ к PrintWindow? У меня Delphi 7, в Windows.pas этой функции еще нет.
Ответить с цитированием
  #5  
Старый 11.04.2011, 14:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
...

function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: Cardinal): Boolean; stdcall external user32;

implementation

...
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 11.04.2011, 16:04
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

Тогда вопрос такой. Мне нужно получить скриншот клиентской части окна. Насколько я понял, для этого надо вызывать PrintWindow с флагом PW_CLIENTONLY, и тогда вызывается сообщение для нужного мне окна WM_PRINTCLIENT. Но в документации я прочитал, что оно не обрабатывается, в отличие от WM_PRINT, автоматически с помощью DefWindowProc, программист должен написать свой обработчик этого сообщения. Кажется, программист, разработавший нужное окно, это сделал, но коряво, так что с флагом PW_CLIENTONLY номер не проходит. Получается, что мне доступно только целиковое изображение нужного мне окна с рамкой и заголовком. Вопрос такой: как мне отсечь из получаемого мной изображения именно клиентскую область? то есть, мне нужно смещение клиентской области окна относительно неклиентской. В Win32 API я подходящей функции я не знаю. Как мне быть?
Ответить с цитированием
  #7  
Старый 11.04.2011, 16:05
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

Слушай, а зачем вообще те все это ? Т.е. что за программу ты пишешь для которой нужен скриншот чужой проги ?

ЗЫ
А вообще ты можешь сперва вывести окно на передний план, а потом уже сделать скриншот. В идеале потом можешь вернуть обратно окошко на задний план)
Ответить с цитированием
  #8  
Старый 11.04.2011, 16:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

GetClientRect / GetWindowRect ?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 11.04.2011, 16:14
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

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

А выдвигать нужное мне окно на передний план и затем задвигать его обратно - не пойдет, некомильфо. Я ж знаю, что можно снимок корректный получить и без этого. Теперь передо мной стоит вопрос, как мне из него выделить именно клиентскую часть окна.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:37.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter