|
||||
|
Глава 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.
|
|
||
Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх |
||||
|