Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как снимать скриншоты десктопа без тормозов (GDI)


yuravss ©   (2003-02-09 16:12:00) 

Хай !
Не могу справиться с проблемой. Целый день уже роюсь в MSDN и в
интернете. Вобщем выручайте !!!!!!!!!!
Пишу программу типа RAdmina (должна снимать копии экрана и их быстро передавать по сети).
Снимки экрана я делаю., используя GDI API - каждые 100 мс:

procedure TForm1.Timer1Timer(Sender: TObject);
const BuffSize=1000;
var ScreenDC, MemDC:HDC;
Bitmap: HBITMAP;
buff: array[0..BuffSize-1] of byte;
begin
ScreenDC := GetDC(0);
MemDC := CreateCompatibleDC(ScreenDC);
Bitmap:=CreateCompatibleBitmap(ScreenDC, 1024, 768);
SelectObject(memDC,Bitmap);

BitBlt(MemDC,0,0,1024,768,ScreenDC,0,0,SRCCOPY);
GetBitmapBits(Bitmap, BuffSize, @buff); //Копируем битмап в буффер
// Некоторые действия пикселями в буффере, например пересылка буффера
в сеть
// ......
ReleaseDC(0, ScreenDC);
end;

Оно то работает, но так тормозит, что даже мышь не шевелиться в
Windows"e.
Тормоза вызваны главным образом функцией GetBitmapBits. Я ее вызываю
чтобы получить пиксели (битмап) и отправить их в сеть через сокет.
-------------------------
ВОПРОС 1:
Как можно получить доступ к пикселям Bitmap после выполнения BitBlt ?
т.е я не хочу их копировать в дополнительный буффер функцией GetBitMaps.
Ведь после выполнения функции
BitBlt(MemDC,0,0,1024,768,ScreenDC,0,0,SRCCOPY) я уже получаю гдето в
памяти битовую карту Bitmap с копией десктопа.
А можно ли напрямую получить доступ к пикселям самого десктопа не
копируя их в дополнительный Bitmap ?

ВОПРОС 2:
Как мне лучше битмап передавать по сети ? Хотелось бы какой нибудь
компресии битмапа. И во вторых не хотелось бы иметь проблем с
отображением битмапа на удаленной машине (имеется ввиду апаратная
зависимость формата DDB).


i-C3H7OH   (2003-02-11 14:16:00) [1]

используй CreateDIBSection - имеешь доступ к массиву пикселей и BitBlt сделать можно.

вообще-то в Вин2000 есть специальная технология для получения снимков экрана по сети. хоть убей не помню как называется.


yuravss   (2003-02-10 15:08:00) [2]

Я хочу после копирования битмап по кускам отправлять в сеть и, кроме того, сжимать в PNG или ZLIB или че-нить другое.
Надо же нагрузку на сеть уменьшить. Чтобы быстро обработать копию изображения асмовскими инструкциями мне нужно чтобы она находилась в буффере, а не обращаться к пикселям через медленные вызовы property-функций.


Jel   (2003-02-10 12:32:00) [3]

А для чего вообще связываться с GetBitmapBits? Если кроме отправки по сети ничего не нужно то почему бы не создать tBitmap и не скопировать десктоп на него. А потом, скажем tBitmap.SaveToStream.

Для компрессии можно использовать ZLib. Она неплохо управляется с потоками.


Наверх

Титульная страница Поиск, карта сайта Написать письмо