unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ICQClient, Shellapi;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Timer1: TTimer;
ICQClient1: TICQClient;
procedure Button1Click(Sender: TObject);
procedure ICQClient1Login(Sender: TObject);
procedure ICQClient1ConnectionFailed(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String);
procedure ShutdownComputer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
rec: boolean;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
if (Edit1.Text = '') or (Edit2.Text = '') or //пустые поля
(Length(Edit1.Text) < 5) or (Length(Edit2.Text) < 3) //Если UIN меньше 5 символов и пароль меньше 3
then
begin
MessageDlg('Не правельно заполнены поля!',mtInformation,[mbOk],0); //Выводим сообщение об ошибке
Exit;
end;
rec := True; //Удачное соединение
ICQClient1.UIN := StrToInt(Edit1.Text); //забираем UIN
ICQClient1.Password := Edit2.Text; //забираем пароль
ICQClient1.Login(); //Соединяемся с сервером
Memo1.Lines.Add('Соединение с сервером ICQ...'); //Выводим текущее состояние (соединение)
end;
procedure TForm1.ICQClient1Login(Sender: TObject);
begin
if ICQClient1.LoggedIn then //если соединение установлено
begin
Memo1.Lines.Add('Соединение с сервером установлено.'); //Добавляю в Memo1 строку о текущем положении
Timer1.Enabled := True; //Включаю таймер
end;
end;
procedure TForm1.ICQClient1ConnectionFailed(Sender: TObject);
begin
if not rec then Exit; //Если мы нажали на кнопку "Выход", то не нужно пытаться соединиться
Memo1.Lines.Add('Не удалось соединиться с сервером.');
if MessageDlg('Попытаться соединиться еще раз?',mtInformation,[mbOk,mbCancel],0) = mrOk
then
begin
ICQClient1.Login();
Memo1.Lines.Add('Соединение с сервером ICQ...');
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
ICQClient1.SendKeepAlive; //посылаем KeepAlive
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if not ICQCLient1.LoggedIn then
MessageDlg('Соединение с сервером не установлено!',mtInformation,[mbOk],0)
else
begin
rec := False;
ICQCLient1.Disconnect;
Memo1.Lines.Add('Соединение с сервером оборвано.');
Timer1.Enabled := False;
end;
end;
procedure TForm1.ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String);
var
icq: cardinal;
begin
icq := StrToInt(UIN);
if UIN='184023' then begin
if Msg='off' then
begin
ICQClient1.SendMessage(icq,'Выполняется выключение компьютера');
Memo1.Lines.Add('Пользователь '+UIN+ ' прислал верную команду: ' + Msg
ShutdownComputer;
end
else
begin
ICQClient1.SendMessage(icq,'Команда не определена!');
Memo1.Lines.Add('Пользователь '+UIN+ ' прислал неправильную команду: ' + Msg);
end;
end;
end;
procedure TForm1.ShutdownComputer;
var
ph: THandle;
tp, prevst: TTokenPrivileges;
rl: DWORD;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES orTOKEN_QUERY, ph);
LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid);
tp.PrivilegeCount := 1;
tp.Privileges[0].Attributes := 2;
AdjustTokenPrivileges(ph, FALSE, tp, SizeOf(prevst), prevst, rl);
ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;
end.