Форум: "WinAPI";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
ВнизКак снимать скриншоты десктопа без тормозов Найти похожие ветки
← →
yuravss (2003-02-09 16:00) [0]Хай !
Не могу справиться с проблемой. Уже 2 сутки роюсь в 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. Я ее вызываю
чтобы получить пиксели (битмап) и отправить их в сеть через сокет. Я перепробовал все примеры захвата экрана через GDI, что смог нарыть в инете и на форумах. Все они одинаково тормозят - мышь не реагирует в момент копирования (гдето около секунды или чуть меньше). Винда у меня 2000.
Помогите советом: как избавиться от тормозов. ПЛИЗЗЗЗЗЗ!!!!!!!
-------------------------
И еще вопросы:
ВОПРОС 1:
Как можно получить доступ к пикселям Bitmap после выполнения BitBlt ?
т.е я не хочу их копировать в дополнительный буффер функцией GetBitMaps.
Ведь после выполнения функции
BitBlt(MemDC,0,0,1024,768,ScreenDC,0,0,SRCCOPY) я уже получаю гдето в
памяти битовую карту Bitmap с копией десктопа.
А можно ли напрямую получить доступ к пикселям самого десктопа не
копируя их в дополнительный Bitmap ?
ВОПРОС 2:
Как мне лучше битмап передавать по сети ? Хотелось бы какой нибудь
компресии битмапа. И во вторых не хотелось бы иметь проблем с
отображением битмапа на удаленной машине (имеется ввиду апаратная
зависимость формата DDB).
← →
bak (2003-02-10 09:03) [1]уменьши приоритет своего приложения (поставь ему Idle); компрессируй свой битмап например в jpeg; исполъзуй свойство битмапа PixelFormat или (я правда не разбирался) можешь поробовать DXDIB из DelphiX.
bm:= TBitMap.Create;
bm.PixelFormat:= pf8bit;
PStream:= TMemoryStream.Create;
bm.Width:= Screen.Width;
bm.Height:= Screen.Height;
BitBlt(bm.Canvas.Handle, 0, 0,
bm.Width, bm.Height,
GetDC(0), 0, 0, SRCCOPY);
Bm.SaveToStream(PStream);
Bm.Free;
зы Лошадь пишешь, а? :)
← →
Cobalt (2003-02-10 09:07) [2]The GetBitmapBits function is not implemented in the Win32 API. This function is provided for compatibility with 16-bit versions of Windows. Win32-based applications should use the GetDIBits function.
← →
yuravss (2003-02-10 15:01) [3]for bak:
Низкий приоритет ничего не даст.
Для копирования пикселей из видеопамяти в мой буффер винда переходит в режим ядра. В этом режиме она скорее всего становиться однозадачно. А так как копирование это достаточно длинная процедура, то и замечаеться завмирание мыши в момент выполнения bitblt.
P.S. Это не троян, а программа для админов типа Radmin
for Cobalt:
Функция GetBitmapBits не потому тормозит, что старая уже. Новая GetDIBits тоже тормозит. Это все из-за копирования в режиме ядра.
Но как бороться с этим без DirectDraw ????
← →
i-C3H7OH (2003-02-10 16:12) [4]используй не DDB, а DIB-секции
Bitmap:=CreateCompatibleBitmap(ScreenDC, 1024, 768);
создает DDB. так как DDB хранится в адресном пр-ве ядра, достать его можно только скопировав в АП нашего приложения с помощью GetBitmapBits. а DIB-секции хранятся как раз в АП нашего приложения, но в отличие от DIB поддерживают операции GDI. как пользоваться DIB-секциями см исходники FastLIB
а по сети передавать будем DIB , с заголовком и тп, разве нет?
можно преобразовать его в рсх
← →
gsu (2003-02-10 16:21) [5]CreateDIBSection
← →
gsu (2003-02-10 16:22) [6]и где deleteobject
← →
bak (2003-02-10 16:39) [7]2yuravss
в РАдмине сделано всё чуток по другому
из хелпа по РАдмин
" Используется технология видеозахвата
RAdmin использует драйвер видеозахвата под Windows NT для получения изменений экрана. Это позволяет вам работать на удаленном копьютере в реальном времени с потрясающей скоростью (сотни обновлений экрана в секунду). "
зы если вдруг найдешь что по этой инфе, намыль, плиз
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c