Реализация удаленного захвата экрана с помощью Delphi
Shandong Juli Co., Ltd. Центр САПР
Тан Гэцинь
---- При управлении сетью иногда необходимо понять, как используются подключенные к сети компьютеры, отслеживая экран удаленного компьютера. Хотя на рынке существует множество программ, которые могут реализовать эту функцию, а некоторые даже могут выполнять удаленное управление, им не хватает гибкости в использовании. Например, они не могут указать размер и положение области экрана удаленного компьютера и, следовательно, не могут контролировать несколько. экраны на одном экране одновременно. Фактически, вы можете использовать Delphi для создания гибкого инструмента удаленного захвата экрана, который кратко описывается следующим образом.
---- 1. Требования к программному и аппаратному обеспечению.
---- Одноранговая сеть Windows95/98, компьютер, используемый для мониторинга (далее именуемый главным компьютером), и контролируемый компьютер (далее именуемый управляемым компьютером) должны быть оснащены протоколом TCP/ip. протокол и настроен правильно. Если сети нет, отладку можно выполнить и на компьютере.
---- 2. Способ реализации.
---- Подготовьте два приложения: одно — VClient.exe, установленное на управляемой машине, а другое — VServer.exe, установленное на основной управляющей машине. VServer.exe указывает IP-адрес контролируемой машины, которую необходимо отслеживать, а также размер и положение области для захвата на экране управляемой машины и выдает команду захвата экрана VClient.exe. После получения инструкции VClient. .exe Выберите обозначенную область на экране компьютера, сгенерируйте поток данных, отправьте его обратно на главный компьютер и отобразите BMP-изображение захваченной области на главном компьютере. Из приведенного выше процесса видно, что у этого метода есть два ключа: один — как сделать снимок экрана на управляемой машине, а другой — как передать данные между двумя компьютерами через протокол TCP/IP.
---- UDP (User Datagram PROtocol, что означает протокол пользовательских сообщений) — один из протоколов связи, широко используемых в Интернете. В отличие от протокола TCP, это протокол передачи без соединения, без механизма подтверждения, и он не так надежен, как TCP, но он более эффективен, чем TCP, и больше подходит для удаленного мониторинга экрана. В то же время управление UDP не различает сервер и клиент, а только отправляющую и принимающую стороны. Программирование относительно простое, поэтому выбирается протокол UDP и используется управление TNMUDP, предоставляемое Delphi 4.0.
---- 3. Создайте демонстрационную программу.
----Первым шагом является компиляция файла VClient.exe. Создайте новый проект Delphi и установите для свойства Name формы по умолчанию значение «Клиент». Добавьте элемент управления TNMUDP, установите для атрибута Name значение «CUDP»; установите для атрибута LocalPort значение «1111», позвольте элементу управления CUDP контролировать порт 1111 управляемого компьютера, и когда данные отправляются на порт, запускайте событие OnDataReceived управляющий CUDP; установите для атрибута RemotePort значение «2222», когда управляющий CUDP отправляет данные, данные отправляются на порт 2222 главного компьютера.
---- Добавить определение переменной после реализации
const BufSize=2048;{Размер буфера для отправки каждого фрагмента данных}
вар
BmpStream:TMemoryStream;
LeftSize:Longint;{Количество байтов, оставшихся после отправки каждого фрагмента данных}
Добавьте код для события OnCreate клиента:
процедура TClient.FormCreate(Отправитель: TObject);
начинать
BmpStream:=TMemoryStream.Create;
конец;
Добавьте код для события OnDestroy клиента:
процедура TClient.FormDestroy(Отправитель: TObject);
начинать
BmpStream.Бесплатно;
конец;
Добавьте код для события OnDataReceived элемента управления CUDP:
процедура TClient.CUDPDataReceived(Отправитель: TComponent;
NumberBytes: целое число; FromIP: строка);
вар
CtrlCode: массив [0..29] символов;
Buf:array[0..BufSize-1] символов;
ТмпСтр: строка;
SendSize,LeftPos,TopPos,RightPos,BottomPos:целое число;
начинать
CUDP.ReadBuffer(CtrlCode,NumberBytes);{Читать управляющий код}
если CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='показать', то
Begin {Первые 4 цифры управляющего кода — «показать», что указывает на то, что главный компьютер выдал команду захвата экрана}
если BmpStream.Size=0, то {Данные не могут быть отправлены, для создания данных необходимо сделать снимки экрана}
начинать
TmpStr:=StrPas(CtrlCode);
TmpStr:=Copy(TmpStr,5,Length(TmpStr)-4);
LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)
-Pos(':',TmpStr));
TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-
Pos(':',TmpStr));
RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
BottomPos:=StrToInt(Copy(TmpStr,Pos(':',TmpStr
)+1,Length(TmpStr)-Pos(':',TmpStr)));
ScreenCap(LeftPos,TopPos,RightPos,BottomPos);
Сделать скриншот}
конец;
если LeftSize>BufSize, то SendSize:=BufSize
еще SendSize:=LeftSize;
BmpStream.ReadBuffer(Buf,SendSize);
LeftSize:=LeftSize-SendSize;
если LeftSize=0, то BmpStream.Clear;{очистить поток}
CUDP.RemoteHost:=FromIP; {FromIP — IP-адрес хоста}
CUDP.SendBuffer(Buf,SendSize) {Отправить данные на порт 2222 хост-компьютера};
конец;
конец;
ScreenCap — это пользовательская функция, захватывающая указанную область экрана.
Код выглядит следующим образом:
процедура TClient.ScreenCap(LeftPos,TopPos,
RightPos, BottomPos: целое число);
вар
RectWidth, RectHeight: целое число;
SourceDC,DestDC,Bhandle: целое число;
Растровое изображение:TBitmap;
начинать
RectWidth:=RightPos-LeftPos;
RectHeight:=BottomPos-TopPos;
SourceDC:=CreateDC('DISPLAY',',',nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,
RectWidth, RectHeight);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,
LeftPos, TopPos, SRCCOPY);
Растровое изображение:=TBitmap.Create;
Bitmap.Handle:=BHandle;
BitMap.SaveToStream(BmpStream);
BmpStream.Position:=0;
LeftSize:=BmpStream.Size;
Растровое изображение.Бесплатно;
УдалитьDC(DestDC);
ReleaseDC (Bhandle, SourceDC);
конец;
Сохраните как «C:VClientClnUnit.pas» и «C:VClientVClient.dpr»,
и скомпилировать.
----Второй шаг — скомпилировать файл VServer.exe. Создайте новый проект Delphi и установите для свойства Name формы значение «Сервер». Добавьте элемент управления TNMUDP, установите для атрибута Name значение «SUDP»; установите для атрибута LocalPort значение «2222», позвольте элементу управления SUDP контролировать порт 2222 хост-компьютера, а когда данные отправляются на порт, запускайте событие OnDataReceived для управляющего SUDP установите атрибут RemotePort «1111», когда управляющий SUDP отправляет данные, данные отправляются на порт 1111 управляемой машины. Добавьте элемент управления Image1, установите для свойства Align значение «alClient»; добавьте элемент управления Button1, установите для свойства Caption значение «Screenshot»; добавьте элемент управления Label1, установите для свойства Caption значение «Left: Top: Right: Bottom»; Введите элемент управления Edit1 и установите для свойства Text значение «0:0:100:100»; добавьте элемент управления Label2 и установите для свойства Caption значение «IP-адрес управляемого компьютера»; добавьте элемент управления Edit2 и установите для свойства Text значение «127.0.0.1»;
Добавить определение переменной после реализации
константный BufSize = 2048;
вар
RsltStream, TmpStream:TMemoryStream;
Добавьте код для события OnCreate сервера:
процедура TServer.FormCreate(Отправитель: TObject);
начинать
RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create;
конец;
Добавьте код для события OnDestroy клиента:
процедура TServer.FormDestroy(Отправитель: TObject);
начинать
RsltStream.Free;
TmpStream.Free;
конец;
Добавьте код для события OnClick элемента управления Button1:
процедура TServer.Button1Click(Отправитель: TObject);
var ReqCode: массив [0..29] из символов; ReqCodeStr: строка;
начинать
ReqCodeStr:='show'+Edit1.Text;
StrpCopy(ReqCode,ReqCodeStr);
ТмпСтрим.Очистить;
РслтСтрим.Очистить;
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
конец;
Добавьте код для события OnDataReceived элемента управления SUDP:
процедура TServer.SUDPDataReceived(Отправитель: TComponent;
NumberBytes: целое число; FromIP: строка);
var ReqCode: массив [0..29] из символов; ReqCodeStr: строка;
начинать
ReqCodeStr:='show'+Edit1.text;
StrpCopy(ReqCode,ReqCodeStr);
SUDP.ReadStream(TmpStream);
RsltStream.CopyFrom(TmpStream,NumberBytes);
если NumberBytes< BufSize, то {данные прочитаны}
начинать
RsltStream.Position:=0;
Изображение1.Картинка.Растровое изображение.LoadFromStream(RsltStream);
ТмпСтрим.Очистить;
РслтСтрим.Очистить;
конец
еще
начинать
ТмпСтрим.Очистить;
ReqCode:='показать';
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
конец;
конец;
Сохраните как «C:VServerSvrUnit.pas» и
«C:VServerVServer.dpr» и скомпилируйте.
---- 4. Тест.
---- 1. Тестирование на локальном компьютере: одновременно запустите Vserver.exe и VClient.exe на локальном компьютере и используйте настройки программы по умолчанию для создания снимков экрана. Проверьте «Панель управления» — «Сеть» — «TCP/IP» — «IP-адрес», установите в качестве «IP-адреса клиента» программы этот адрес, и она будет работать нормально.
---- 2. Удаленный тест: выберите управляемую машину, запустите VClient.exe; выберите другую главную машину, запустите VServer.exe и установите «IP-адрес управляемой машины», то есть содержимое Edit2, как контролируемое. IP-адрес машины и «сделать снимок экрана». Выше кратко представлен метод реализации удаленного захвата экрана. Что касается одновременного наблюдения за несколькими управляемыми машинами на одном экране основной управляющей машины, читатели могут улучшить его самостоятельно. Вышеупомянутая программа была отлажена и передана в одноранговую сеть Windows98 и Delphi 4.0.