Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 9

Удалённый просмотр рабочего стола

10.05.2015, 11:39. Показов 3101. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Работаю над клиент-серверной программой, которая передаёт изображение с рабочего стола сервера в виде окна клиенту. Нашёл в инете пару исходников, и пытаюсь склеить их в кучу.
Код клиента:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
unit uMain;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, StdCtrls;
 
type
  TForm1 = class(TForm)
    imgScreen: TImage;
    GroupBox1: TGroupBox;
    txtServer: TEdit;
    cmbConnect: TButton;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    lblResolution: TLabel;
    lblColors: TLabel;
    IdTCPClient1: TIdTCPClient;
    Timer1: TTimer;
    procedure cmbConnectClick(Sender: TObject);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure IdTCPClient1Disconnected(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.cmbConnectClick(Sender: TObject);
begin
  if cmbConnect.Caption = 'Подключиться' then
  begin
    if txtServer.Text = '' then
      //не введено имя сервера
      MessageDlg('Введите имя машины-сервера в текстовом поле', mtInformation, [mbOK], 0)
    else
    begin
      //подключаемся к серверу
      IdTCPClient1.Host := txtServer.Text;
      try
        IdTCPClient1.Connect;
      except
        MessageDlg('Не удается соединиться с указанным сервером', mtError, [mbOK], 0);
        Exit;
      end;
    end
  end
  else
    //отключаемся от сервера
    IdTCPClient1.Disconnect;
end;
 
procedure TForm1.IdTCPClient1Connected(Sender: TObject);
begin
  txtServer.Enabled := False;
  cmbConnect.Caption := 'Отключиться';
  //начинаем периодически запрашивать данные с сервера
  Timer1.Enabled := True;
  //выполним первый запрос, не дожидаясь срабатыввания таймера
  Timer1Timer(nil);
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
  stream: TMemoryStream;
begin
  //запрашаваем у сервера данные о наблюдаемом компьютере
  with (IdTCPClient1) do
  begin
    //...разрешение
    WriteLn('get_screen_width');
    WriteLn('get_screen_height');
    lblResolution.Caption := IntToStr(ReadInteger) + 'x' + IntToStr(ReadInteger);
 
    //...глубина цвета
    WriteLn('get_screen_colors');
    lblColors.Caption := IntToStr(ReadInteger);
 
    //...копия экрана
    //.....1-й вариант - копирование экрана без сжатия
    //WriteLn('get_screen');
    //.....2-й вариант - сжатие на стороне сервера
    WriteLn('get_screen:' + IntToStr(imgScreen.Width) + ',' +
            IntToStr(imgScreen.Height));
    //....получаем данные
    stream := TMemoryStream.Create;
    ReadStream(stream);
    stream.Position := 0;
    //....формируем изображение
    imgScreen.Picture.Bitmap.LoadFromStream(stream);
    stream.Clear;
    stream.Free;
  end;
end;
 
procedure TForm1.IdTCPClient1Disconnected(Sender: TObject);
begin
  txtServer.Enabled := True;
  cmbConnect.Caption := 'Подключиться';
  Timer1.Enabled := False;
end;
 
end.
Код сервера:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
unit uMain;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPServer, ExtCtrls;
 
type
  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
//процедура снимает копию экрана, приводит полученное
//изображение к заданному размеру и отправляет
//преобразованное изображение клиентской программе
procedure SendScreen(width1: Integer; height1: Integer; Connection: TIdTCPServerConnection);
var
  ScreenCopy: TCanvas;
  gr: TBitmap;
  stream: TMemoryStream;
  rcDest, rcSource: TRect;
begin
  rcDest := Rect(0,0,width1,height1); //конечный размер изображения
  rcSource := Screen.DesktopRect; //исходный размер изображения
  //создаем канву и присоединяем ее к контексту Рабочего стола
  ScreenCopy := TCanvas.Create;
  ScreenCopy.Handle := GetDC(0);
  //создаем объект для хранения копии экрана и копируем изображение
  gr := TBitmap.Create;
  gr.Height := height1;
  gr.Width := width1;
  gr.Canvas.CopyRect(rcDest, ScreenCopy, rcSource);
  ReleaseDC(0, ScreenCopy.Handle);
  //сохраняем изображение в поток данных
  stream := TMemoryStream.Create;
  gr.SaveToStream(stream);
  //отправляем изображение клиенту
  Connection.WriteStream(stream, true, true);
  stream.Clear;
  stream.Free;
  gr.Free;
end;
 
 
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  strText: String;
  width, height, i: Integer;
  dc: HDC;
begin
  //принмаем от клиента стркоу
  strText := AThread.Connection.ReadLn;
  //определяем, что нужно выполнить
  if strText = 'get_screen_height' then
    //возвратим высоту экрана
    AThread.Connection.WriteInteger(Screen.Height)
  else if strText = 'get_screen_width' then
    //возвратим ширину экрана
    AThread.Connection.WriteInteger(Screen.Width)
  else if strText = 'get_screen_colors' then
  begin
    //возвратим количество бит на точку
    dc := GetDC(0);
    AThread.Connection.WriteInteger(GetDeviceCaps(dc, BITSPIXEL));
    ReleaseDC(0, dc)
  end
  else if strText = 'get_screen' then
    //возвратим полноразмерную копию экрана
    SendScreen(Screen.Width, Screen.Height, AThread.Connection)
  else
  begin
    //строка вида 'get_screen:x, y'
    //Определим значени высоты и ширины переданные пользователем
    strText := Copy(strText, 12, Length(strText) - 11);
    i := Pos(',', strText); //положение запятой
    width := StrToInt(Copy(strText, 1, i - 1));
    height := StrToInt(Copy(strText, i+1, Length(strText) - i));
    //возвратим копию экрана
    SendScreen(width, height, AThread.Connection);
  end;
end;
 
end.
Проблема в том, что в локальной сети клиент не видит сервера, и получается, что пока она работает только в пределах одного компа, и демонстрирует мне мой же рабочий стол. Так же при каких-либо изменениях программы сервера (например, вставляю пустую кнопку в окно приложения), она отказывается компилится, и вылетает ошибка SOCKET ERROR 10049. CANNOT ASSIGN REQUESTED ADRESS.'. Process stoped...
Я в Delphi новичёк, и мне очень нужна ваша помощь, друзья. Что тут не так? Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.05.2015, 11:39
Ответы с готовыми решениями:

Часы для рабочего стола
Здравствуйте Нужна программа аналоговых часов для рабочего стола с редакцией вида. на Delphi

Как найти handle Рабочего стола?
Как найти в Delphi7 handle Рабочего стола? (это нужно, когда в проекте нет форм, и проект запускает другую программу командой...

Программа по смене обоев рабочего стола
Вот захотелось чет чтоб обоины менялись (причем скачивались с интернета). Искал такие программы но ни одна не подходит мне, а хотелось бы...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.05.2015, 11:39
Помогаю со студенческими работами здесь

Почему в Delphi не видится папка рабочего стола в Windows 7?
здравствуйте пожалуйста помогите ни как не могу понять почему делфи не видит мой рабочий стол путь к нему пишу ...

Звук с микрофона и изображение с рабочего стола средствами DirectShow и Bass
Привет. Решил написать программу для работы с изображением рабочего стола и звуком с микрофона. Имеется DirectShow. Нужно отловить звук с...

Удаленный просмотр робочего стола Пользователя!
в общем хочу сделать программу помошник ! и по лучше поработать с компанентами интернета! вот какое дело мне нужно чтобы пользователь...

Удалённый просмотр
Доброго времени суток, нужно очень сделать следуюшюю софтину! Это срочно, нужна очень ваша помошь. Вообшем есть интернет. Есть одна...

Скриншот рабочего стола
Здравствуйте! Пишу программку, которая делает скриншот раб. стола и отправляет его на FTP. Вроде все реализовал, но есть одна маленькая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru