Полученная форма должна соответствовать рис. 15.1.
Рис. 15.1. Форма для программы отправки сообщений в локальной сети
Разработка программного кода
Прежде всего напишем собственную процедуру bomb, которая будет считывать все настройки и отправлять сообщение. Объявите эту процедуру как закрытый член класса формы:
type
TForm1 = class(TForm)
…
private
{ Private declarations }
procedure bomb();
public
{ Public declarations }
end;
Также нам понадобится глобальная переменная i типа integer:
var
Form1: TForm1;
i: integer;
Теперь создадим реализацию процедуры bomb в разделе implementation:
procedure TForm1.bomb();
begin
//проверяем, не пустое ли текстовое сообщение
if txt.Text = '' then txt.Text:= '!';
//если количество не указано, то отправляем одно сообщение
if how.Text= '' then how.Text:= '1';
if ip.Text = '' then ip.Text:= '127.0.0.1'; {если ip-адрес не указан, то отправляем на локальный компьютер}
//отправляем указанное количество сообщений
for i:=1 to StrToInt(how.Text) do
WinExec(PChar('net send ' + ip.Text + '"' + txt.Text + '"'), 0); //отправка сообщения
end;
В этой процедуре выполняется проверка: все ли необходимые поля заполнены. Если нет текста сообщения, то устанавливаем знак "!"; если не указан IP-адрес, то отправляем сообщение на локальный компьютер с адресом 127.0.0.1; если не указано количество сообщений, то отправляем одно сообщение. Сообщения отправляются с помощью стандартной команды net send, которая имеет следующий синтаксис:
net send ip-адрес сообщение.
Теперь обработаем событие таймера OnTimer:
procedure TForm1.Timer1Timer(Sender: TObject);
var
h: HWND; //хранит идентификатор окна
begin
if not secure.Checked then //если флажок не установлен
Timer1.Enabled:= False; //отключаем мониторинг
if secure.Checked then //если флажок установлен
begin
//ищем окна с сообщениями
h:= FindWindow(nil, 'Служба сообщений '); //закрываем все найденные окна
if h <> 0 then PostMessage(h, WM_QUIT, 0, 0);
end;
end;
Если установлен флажок Отключить прием сообщений, то мы начинаем мониторинг окон, заголовок которых говорит о том, что это — сообщение, и закрываем все найденные окна. Если флажок не установлен, то мониторинг отключается.
Для того чтобы можно было переключаться между этими двумя режимами, необходимо создать обработчик события secure.OnClick:
procedure TForm1.secureClick(Sender: TObject);
begin
if secure.Checked then //если флажок установлен…
Timer1.Enabled:= True; //…включаем мониторинг
end;
При нажатии кнопки Send мы будем просто вызывать процедуру bomb:
procedure TForm1.Button1Click(Sender: TObject);
begin
bomb;
end;
Для того чтобы облегчить пользователю жизнь, сделаем так, чтобы отправка сообщения осуществлялась также по нажатии клавиши <Enter> в любом текстовом поле ввода. Для этого необходимо создать обработчик события OnKeyPress для каждого из полей. Код этого обработчика для поля ip, который затем можно назначить полям txt и how:
procedure TForm1.ipKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then //если нажата клавиша <enter>
bomb; //отправка сообщения
end;
Полный исходный код модуля
Полный код модуля программы отправки сообщений по локальной сети представлен в листинге 15.1.
Листинг 15.1. Модуль программы отправки сообщений по локальной сети
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TForm1 = class(TForm)
Button1: TButton;
ip: TEdit;
Label1: TLabel;
Label2: TLabel;
txt: TEdit;
Label3: TLabel;
how: TEdit;
secure: TCheckBox;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure secureClick(Sender: TObject);
procedure ipKeyPress(Sender: TObject; var Key: Char);
procedure txtKeyPress(Sender: TObject; var Key: Char);
procedure howKeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure bomb();
public
{ Public declarations }
end;
var
Form1: TForm1;
i: integer;
implementation
{$R *.dfm}
procedure TForm1.bomb();
begin
//проверяем, не пустое ли текстовое сообщение
if txt.Text = '' then txt.Text:= '!';
//если количество не указано, то отправляем одно сообщение
if how.Text= '' then how.Text:= '1';
if ip.Text = '' then ip.Text:= '127.0.0.1'; {если ip-адрес не указан, то отправляем на локальный компьютер}
//отправляем указанное количество сообщений
for i:=1 to StrToInt(how.Text) do
WinExec(PChar('net send ' + ip.Text + '"' + txt.Text + '"'), 0); //отправка сообщения
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
h: HWND; //хранит идентификатор окна
begin
if not secure.Checked then //если флажок не установлен
Timer1.Enabled:= False; //отключаем мониторинг
if secure.Checked then //если флажок установлен
begin
//ищем окна с сообщениями
h:= FindWindow(nil, 'Служба сообщений '); //закрываем все найденные окна
if h <> 0 then PostMessage(h, WM_QUIT, 0, 0);
end;
end;
procedure TForm1.secureClick(Sender: TObject);
begin
if secure.Checked then //если флажок установлен…
Timer1.Enabled:= True; //…включаем мониторинг
end;
procedure TForm1.ipKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then //если нажата клавиша <enter>
bomb; //отправка сообщения
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
bomb;
end;
end.
⊚ Все файлы проекта и исполняемый файл рассмотренной программы находятся на прилагаемом к книге компакт-диске в папке Chapter 15.
Глава 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. Форма клиентской программы для удаленного управления указателем
Разработка программного кода