![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как снимать скриншоты десктопа без тормозов (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. Она неплохо управляется с потоками.