• Постановка задачи
  • Разработка клиентской программы
  • Разработка формы
  • Разработка программного кода
  • Разработка серверной программы
  • Полный исходный код модулей
  • Глава 16

    Удаленное управление указателем мыши

    Постановка задачи

    Разработать программу, которая в точности повторяет на одном компьютере все движения указателя мыши, сделанные на другом компьютере. Компьютеры могут находиться как в локальной сети, так и в Internet.

    На самом деле нам придется разработать две программы: первая (назовем ее "Клиент") будет получать координаты указателя на одном компьютере и отправлять их второй программе (назовем ее "Сервер"), которая будет принимать и изменять текущие координаты указателя на присланные клиентом. Данный тип связи называется "клиент-сервер" и для его использования у нас есть все необходимые компоненты на стандартной палитре компонентов Delphi. У "клиента" будет форма с настройками, а "сервер" будет работать незаметно для пользователя. Сначала разработаем клиентскую программу.

    Разработка клиентской программы

    Разработка формы

    Создайте новый проект Delphi. Присвойте свойству Caption формы заголовок Remote Mouse. Разместите на форме компонент Label категории Standard и присвойте его свойству Caption значение Port. Справа от этой метки разместите компонент Edit категории Standard. Назовите его port (свойство name), а свойству text присвойте значение 2801.

    Ниже разместите еще один компонент Label, присвоив его свойству Caption значение IP. Справа от него разместите компонент Edit с именем ip и текстом 127.0.0.1.

    В самом низу формы разместите две кнопки (компоненты Button категории Standard), присвоив их свойству Caption значения Connect и Disconnect. Также нам понадобится компонент Timer категории System. В свойствах таймера следует изменить значение свойства Enabled на False, а свойства Interval — на 500 (что соответствует половине секунды).

    Разместите на форме самый важный компонент нашей программы — Client Socket категории Internet — и присвойте ему имя Client (свойство Name). Остальные свойства этого компоненты мы будем изменять в самой программе.

    Полученная форма должна соответствовать рис. 16.1.

    Рис. 16.1. Форма клиентской программы для удаленного управления указателем

    Разработка программного кода

    По нажатию кнопки Connect должны считываться все настройки и выполняться соединение с сервером:

    procedure TForm1.Button1Click(Sender: TObject);

    begin

     Client.Port:= StrToInt(port.Text); //считываем порт

     Сlient.Address:= ip.text; //считываем ip-адрес сервера

     Client.Active:= True; //соединяемся

     Timer1.Enabled:= True; //включаем таймер

    end;

    Сначала мы считываем все необходимые настройки, а затем предпринимаем попытку соединиться с сервером. Если все нормально, то включаем таймер, по которому будут передаваться координаты указателя мыши.

    Обработаем нажатие кнопки Disconnect:

    procedure TForm1.Button2Click(Sender: TObject);

    begin

     Timer1.Enabled:= False;//выключаем таймер

     Client.Close; //закрываем соединение

     Client.Active:=False; //отключаемся от сервера

    end;

    При нажатии кнопки Disconnect мы перестаем передавать координаты указателя на сервер и отсоединяемся от него.

    Для того чтобы на сервере не возникало ошибок при аварийном выключении клиента, создайте обработчик события формы OnDestroy и добавьте в него следующий код:

    procedure TForm1.FormDestroy(Sender: TObject);

    begin

     Client.Close; //закрываем соединение

     Client.Active:=False; //отключаемся от сервера

    end;

    При аварийном завершении программы закрывается соединение и выполняется отключение от сервера.

    Для уведомления пользователя об успешном соединении с сервером создайте обработчик события client.OnConnect:

    procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);

    begin

     ShowMessage('Connected!'); //показать сообщение

    end;

    Для реализации аналогичного действия при отсоединении от сервера, следует создать обработчик события OnDisconnect:

    procedure TForml.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);

    begin

     ShowMessage('Disconnected!'); //сообщение при отсоединении

    end;

    Теперь обработаем событие OnTimer для компонента Timer:

    procedure TForm1.Timer1Timer(Sender: TObject);

    var

     cur:TPoint; //хранит координаты указателя мыши

    begin

     GetCursorPos(cur); //узнаем координаты указателя мыши

     //отправляем данные на сервер

     Client.Socket.SendText(IntToStr(cur.X) +'_' + IntToStr(cur.Y));

    end;

    Каждые полсекунды мы будем получать координаты указателя мыши и отправлять их на сервер. Программа-клиент полностью готова. Теперь разработаем программу-сервер.

    Разработка серверной программы

    Создайте новый проект Delphi. Разместите на форме главный компонент программы — ServerSocket категории Internet и измените значение его свойства Port на 2801.

    Первым делом, обеспечим нашей форме невидимость. Создайте обработчик события формы OnPaint и добавьте в него следующий код:

    procedure TForm1.FormPaint(Sender: TObject);

    begin

     Form1.Hide;

    end;

    Для того чтобы активизировать сервер при запуске программы, необходимо обработать событие формы OnCreate:

    procedure TForm1.FormCreate(Sender: TObject);

    begin

     ServerSocket1.Active:= True; //активизировать сервер

    end;

    Для того чтобы при выходе из программы сервер отключался, необходимо обработать событие формы OnDestroy:

    procedure TForm1.FormDestroy(Sender: TObject);

    begin

     ServerSocket1.Active:= False; //отключаем сервер

    end;

    Теперь осталось только обработать событие OnClientRead компонента ServerSocket. Это событие будет происходить каждый раз, когда будет поступать команда от клиента. Код обработчика этого события имеет следующий вид:

    procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);

    var

     str, x, y: string; //полученный текст и координаты

      //указателя по X и по Y

     i, j: integer; //счетчики циклов

     begin

     //обнуляем координаты курсора

     х := ' ';

     у := ' ';

     str:= Socket.ReceiveText; //полученный от клиента текст

     for i:=1 to Length(str) do begin

      if str[i] <> '_' then x:= x + str[i]; //координаты по х

      if str[i] = '_' then Break; //разделитель между

       //координатами указателя

     end;

     for j:= i+1 to Length(str) do у:= y+str[j]; //координаты по у

     //устанавливаем новые координаты указателя

     SetCursorPos(StrToInt(x), StrToInt(у));

    end;

    При получении текста мы считываем в отдельные переменные значение координат указателя по X и по Y. Затем изменяем координаты на те, которые только что получили от клиента.

    Теперь программа полностью готова, и для того чтобы протестировать ее, необходимо иметь хотя бы два компьютера, объединенные в локальную сеть или подключенные к Internet.

    Полный исходный код модулей

    Полный код модуля серверной программы представлен в листинге 16.1.

    Листинг 16.1. Модуль серверной программы

    unit Unit1;


    interface


    uses

     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp;


    type TForm1 = class(TForm)

     ServerSocket1: TServerSocket;

     procedure FormDestroy(Sender: TObject);

     procedure FormCreate(Sender: TObject);

     procedure ServerSocketlClientRead(Sender: TObject; Socket: TCustomWinSocket);

     procedure FormPaint(Sender: TObject);

    private

     { Private declarations }

    public

     { Public declarations }

    end;


    var

     Form1: TForm1;


    implementation

    {$R *.dfm}


    procedure TForm1.FormDestroy(Sender: TObject);

    begin

     ServerSocket1.Active:= False; //отключаем сервер

    end;


    procedure TForm1.FormCreate(Sender: TObject);

    begin

     ServerSocket1.Active:= True; //активизировать сервер

    end;


    procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);

    var

     str, x, y: string; //полученный текст и координаты

      //указателя по X и по Y

     i, j: integer; //счетчики циклов

     begin

     //обнуляем координаты курсора

     х := ' ';

     у := ' ';

     str:= Socket.ReceiveText; //полученный от клиента текст

     for i:=1 to Length(str) do begin

      if str[i] <> '_' then x:= x + str[i]; //координаты по х

      if str[i] = '_' then Break; //разделитель между

       //координатами указателя

     end;

     for j:= i+1 to Length(str) do у:= y+str[j]; //координаты по у

     //устанавливаем новые координаты указателя

     SetCursorPos(StrToInt(x), StrToInt(у));

    end;


    procedure TForm1.FormPaint(Sender: TObject);

    begin

     Form1.Hide;

    end;


    end.

    Полный код модуля клиентской программы представлен в листинге 16.2.

    Листинг 16.2. Модуль клиентской программы

    unit Unit1;


    interface


    uses

     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ScktComp, StdCtrls, ExtCtrls;


    type TForm1 = class(TForm)

     Button1: TButton;

     Button2: TButton;

     Client: TClientSocket;

     Timer1: TTimer;

     port: TEdit;

     ip: TEdit;

     Label1: TLabel;

     Label2: TLabel;

     procedure Button2Click(Sender: TObject);

     procedure FormDestroy(Sender: TObject);

     procedure Button1Click(Sender: TObject);

     procedure Timer1Timer(Sender: TObject);

     procedure ClientConnect(Sender: TObject; Socket: TCustomWinSocket);

     procedure ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);

    private

     { Private declarations }

    public

     { Public declarations }

    end;


    var

     Form1: TForm1;


    implementation

    {$R *.dfm}


    procedure TForm1.Button2Click(Sender: TObject);

    begin

     Timer1.Enabled:= False;//выключаем таймер

     Client.Close; //закрываем соединение

     Client.Active:= False; //отключаемся от сервера

    end;


    procedure TForm1.FormDestroy(Sender: TObject);

    begin

     Client.Close; //закрываем соединение

     Client.Active:=False; //отключаемся от сервера

    end;


    procedure TForm1.Button1Click(Sender: TObject);

    begin

     Client.Port:= StrToInt(port.Text); //считываем порт

     Сlient.Address:= ip.text; //считываем ip-адрес сервера

     Client.Active:= True; //соединяемся

     Timer1.Enabled:= True; //включаем таймер

    end;


    procedure TForm1.Timer1Timer(Sender: TObject);

    var

     cur:TPoint; //хранит координаты указателя мыши

    begin

     GetCursorPos(cur); //узнаем координаты указателя мыши

     //отправляем данные на сервер

     Client.Socket.SendText(IntToStr(cur.X) +'_' + IntToStr(cur.Y));

    end;


    procedure TForm1.ClientConnect(Sender: TObject; Socket: TCustomWinSocket);

    begin

     ShowMessage('Connected!'); //показать сообщение

    end;


    procedure TForml.ClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);

    begin

     ShowMessage('Disconnected!'); //сообщение при отсоединении

    end;


    end.

    ⊚ Все файлы проекта и исполняемый файл клиентской программы находятся на прилагаемом к книге компакт-диске в папке Chapter_16\Client, а файлы проекта и исполняемый файл серверной программы — в папке Chapter_16\Server.





     

    Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх