Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> скриншот ( Canvas ) объекта чужого окна... 
:(
    Опции темы
CompWorm
  Дата 25.7.2007, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: 1
Всего: 31



приветствую!

есть задача - 
снять скриншот с окна чужого приложения или одного из его объектов.

чего есть - 
1) вопрос решен тут http://forum.vingrad.ru/faq/topic-157640.html

2) на основе инета (конечно же  smile ) сочинил упрощенно-укороченный вариан

Код


var MyCanvas:   TCanvas;
var ScreenDC: HDC;
begin
 ScreenDC := GetDC($029604BC); 
 MyCanvas:=TCanvas.Create();
 MyCanvas.Handle:=ScreenDC;

 Image1.Canvas.Copyrect(MyCanvas.ClipRect, MyCanvas, MyCanvas.ClipRect );  
 Image1.AutoSize :=true;

 ReleaseDC(0,ScreenDC);
 MyCanvas.Free;
end;


где ScreenDC := GetDC($029604BC);  - хэндл нужного мне объекта чужого окна. 
// для общего скриншота юзаем GetDC(0);

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

вопрос - как снять изображение с канвы свернутого или перекрытого другими окнами объекта?

Это сообщение отредактировал(а) CompWorm - 25.7.2007, 01:32


--------------------
PM MAIL   Вверх
misha_mike
Дата 25.7.2007, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 1.6.2007

Репутация: нет
Всего: 1



Странно что всегда работает это:
Код
ScreenDC := GetDC($029604BC);


Хендл это не глобальный идентификатор конкретного объекта, а просто ссылка на его экземпляр. При каждом создании объекта это число будет разным.

А что касается самого вопроса, то если приложение само не захочет свою картинку одать, через канву ее не взять. Есть такое понятие как Clipping, обозначающее доступную для рисования/считывания область. Если какой-то контрол не попал в Clipping Area, то он себя просто не отрисовывает, и его изображение так сказать вообще не определено и никто не может знать как он должен выглядеть.

Можно попробовать заставить его отрисоваться на созданную отдельно канву, для чего служат сообщения WM_ERASEBKGND и WM_PAINT, но с ними не всегда все гладко, как оказалось.
PM MAIL   Вверх
CompWorm
Дата 25.7.2007, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: 1
Всего: 31



Цитата(misha_mike @  25.7.2007,  10:17 Найти цитируемый пост)
Странно что всегда работает это:
ScreenDC := GetDC($029604BC);

ну это я естественно каждый раз беру с Winspector Spy... это я просто для примера число написал.


Цитата(misha_mike @  25.7.2007,  10:17 Найти цитируемый пост)
Можно попробовать заставить его отрисоваться на созданную отдельно канву, для чего служат сообщения WM_ERASEBKGND и WM_PAINT, но с ними не всегда все гладко, как оказалось. 

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


--------------------
PM MAIL   Вверх
MetalFan
Дата 25.7.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



посмотри решение на мастерах


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
misha_mike
Дата 25.7.2007, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 1.6.2007

Репутация: нет
Всего: 1



Ну пример можно посмотреть в исходнике TWinControl.PaintTo, где оба этих сообщения собственно используются. А проблемы тут могут быть со стилями XP/Vista и если отрисовкой контрола занимается не он сам, а например, его Parent.
PM MAIL   Вверх
CompWorm
Дата 31.7.2007, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Допеределыватель
***


Профиль
Группа: Участник Клуба
Сообщений: 1689
Регистрация: 6.12.2004
Где: /

Репутация: 1
Всего: 31



Большое спасибо за помощь )


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1148 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.