⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tools.pas

📁 最好的局域网搜索软件
💻 PAS
📖 第 1 页 / 共 3 页
字号:
    AssignFile(NbtDataFile, AppDir + '\NbtData.bin');
    ReWrite(NbtDataFile);

    for i:=0 to lvNbtDb.Items.Count-1 do
    begin
      NR.IpAddr := trim(lvNbtDb.Items[i].Caption);
      NR.GroupName := trim(lvNbtDb.Items[i].SubItems[0]);
      NR.HostName := trim(lvNbtDb.Items[i].SubItems[1]);
      NR.UserName := trim(lvNbtDb.Items[i].SubItems[2]);
      NR.MacAddr := trim(lvNbtDb.Items[i].SubItems[3]);
      //NR.Separator := #13;
      {Block}Write(NbtDataFile, NR{, SizeOf(NR), NumWritten});
    end;

    CloseFile(NbtDataFile);
  end;

end;

procedure TToolsForm.LoadNbtData;
var
  NbtDataFile   : file of TNbtRecord;
  item          : TListItem;
  i             : integer;
  NR            : TNbtRecord;
  //NumWritten  : integer;
begin

  if not FileExists('NbtData.bin') then exit;

  AssignFile(NbtDataFile, 'NbtData.bin');
  Reset(NbtDataFile);

  lvNbtDb.Items.BeginUpdate;

  while not eof(NbtDataFile) do
  begin
    read(NbtDataFile, NR);
    item := lvNbtDb.Items.Add;
    item.Caption := trim(NR.IpAddr);
    for i := 0 to 3 do item.SubItems.Add('');
    item.SubItems[0] := trim(NR.GroupName);
    item.SubItems[1] := trim(NR.HostName);
    item.SubItems[2] := trim(NR.UserName);
    item.SubItems[3] := trim(NR.MacAddr);
    Application.ProcessMessages;
  end;

  lvNbtDb.Items.EndUpdate;

  CloseFile(NbtDataFile);

  Label20.Caption := '共 ' + inttostr(lvNbtDb.Items.Count) + ' 台主机';

end;

procedure TToolsForm.AddNbtData(Item: TListItem);
var
  TemItem       : TListItem;
  i             : integer;
begin

  for i := 0 to lvNbtDb.Items.Count - 1 do
  begin
    if (trim(lvNbtDb.Items[i].Caption) = trim(Item.Caption))
    and(trim(lvNbtDb.Items[i].SubItems[0]) = trim(Item.SubItems[0]))
    and(trim(lvNbtDb.Items[i].SubItems[1]) = trim(Item.SubItems[1]))
    and(trim(lvNbtDb.Items[i].SubItems[2]) = trim(Item.SubItems[2]))
    and(trim(lvNbtDb.Items[i].SubItems[3]) = trim(Item.SubItems[3]))
    then exit;
    //Application.ProcessMessages;
  end;

  TemItem := lvNbtDb.Items.Add;
  TemItem.Caption := Item.Caption;
  TemItem.SubItems.Add(Item.SubItems[0]);
  TemItem.SubItems.Add(Item.SubItems[1]);
  TemItem.SubItems.Add(Item.SubItems[2]);
  TemItem.SubItems.Add(Item.SubItems[3]);
  Label20.Caption := '共 ' + inttostr(lvNbtDb.Items.Count) + ' 台主机';
  Application.ProcessMessages;

end;

procedure TToolsForm.N2Click(Sender: TObject);
var
  f             : TextFile;
  i, j          : integer;
  s, str, s_h   : string;
begin

  if CurListView.Items.Count = 0 then
  begin
    //Application.MessageBox('没有可保存的内容!  ','Save File',MB_OK );
    ShowMessage('没有可保存的内容!  ');
    exit;
  end;

  s := TimeToStr(time);
  for i:=1 to length(s) do if s[i]=':' then s[i]:='-';
  // 注意 PageCtrl.ActivePage.Caption 中不应含有文件名中不允许使用的字符。
  SaveDlg.FileName := PageCtrl.ActivePage.Caption +'('+DateToStr(now)+'-'+s+')';
  
  if SaveDlg.Execute then
  begin
    NewStyleControls := False;
    assignfile(f,SaveDlg.filename);
    rewrite(f);

    for j:=0 to (CurListView.Columns.Count - 1)
      do s_h := s_h + FixLenStr(CurListView.Columns[j].Caption, 15) + #9;
    writeln(f, s_h);
    //for j:=0 to (CurListView.Columns.Count - 1) do write(f, '                ');
    writeln(f);

    for i:=0 to CurListView.Items.Count-1 do
    begin
      str := FixLenStr(CurListView.Items[i].Caption, 15) + #9;  //#9 is tab
      for j:=0 to (CurListView.Items[i].SubItems.Count-1) do
        str := str + FixLenStr(CurListView.Items[i].SubItems[j], 15) + #9;
        
      writeln(f, str);
      //writeln(f);
    end;

    CloseFile(f);
    NewStyleControls := true; 
  end;

end;

procedure TToolsForm.PopupMenu1Popup(Sender: TObject);
begin

  PageCtrlChange(Self);

  N1.Enabled := false;
  N2.Enabled := false;
  if CurListView.Items.Count <> 0 then
  begin
    N1.Enabled := true;
    N2.Enabled := true;
  end;
  
end;

procedure TToolsForm.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin

  if (btnNbt.tag = 1)or(btnScanPort.tag = 1)or(btnPing.tag = 1) then
  begin
    CanClose := false;
    ShowMessage('扫描尚未完成,请稍候。');
    //Application.MessageBox('扫描尚未完成,请稍候。', '网络工具', 0);
  end
  else CanClose := true;

end;

//------------------------------------------------------------------------------
procedure TToolsForm.PortShowProgress(Sender: TObject);
begin
  with Sender as TScanStatus do
  Label11.Caption := '正在扫描 ' + IP + ' 端口:' + Port;
end;

procedure TToolsForm.PortOnConnect(Sender: TObject);
var
  item          : TListItem;
  TemNode       : TTreeNode;
  host          : string;
  MyItemPtr     : PMyTreeItem;
  status        : TScanStatus;
begin

  PortScanHasItem := true;
  //ListBox1.Items.Add(string(Sender));
  item := lvPortScan.Items.Insert(0);
  status := TScanStatus(Sender);
  item.Caption := status.IP;//string(Sender);
  item.SubItems.Add(status.Port{cbScanPort.Text});

  if cbAddToTree2.Checked and (PreviousPortScanIP <> status.IP) then
  with MainForm do
  begin
    LeftPageCtrl.ActivePageIndex := 0;
    SearchPageCtrl.ActivePageIndex := 1;

    if status.Port = '21' then
    begin
      host := 'ftp://' + status.IP;
      TemNode := IpTree.Items.AddChild(IpTree.Items[0], host);
      TemNode.ImageIndex := 114;
      TemNode.SelectedIndex := 114;
      TemNode.Data := nil;
    end
    else if status.Port = '80' then
    begin
      host := 'http://' + status.IP;
      TemNode := IpTree.Items.AddChild(IpTree.Items[0], host);
      TemNode.ImageIndex := 123;
      TemNode.SelectedIndex := 123;
      TemNode.Data := nil;
    end
    else
    begin
      host := '\\' + status.IP;
      TemNode := IpTree.Items.AddChild(IpTree.Items[0], host);
      TemNode.ImageIndex := 7;
      TemNode.SelectedIndex := 7;

      New(MyItemPtr);
      MyItemPtr^.group := IpTree.Items[0].Text;
      MyItemPtr^.dirName := host;
      TemNode.Data := MyItemPtr;

      if status.Port <> '139' then PreviousPortScanIP := status.IP; // prevent duplicate IP when scan in a port range.
    end;    
    IpTree.Items[0].Expand(false);
  end;

end;

procedure TToolsForm.PortOnExitScan(Sender: TObject);
begin

  //btnScanPort.Enabled := true;
  btnScanPort.Tag := 0;
  btnScanPort.Caption := '开始';
  edtScanIP1.Enabled := true;
  edtScanIP2.Enabled := true;
  cbScanPort1.Enabled := true;
  cbScanPort2.Enabled := true;
  rbUseFromTo.Enabled := true;
  rbUseList.Enabled := true;
  spTimeOut.Enabled := true;
  Label11.Caption := '完成';

  if cbAddToTree2.Checked then
  begin
    MainForm.IpTree.Items[0].ImageIndex := 132;
    MainForm.IpTree.Items[0].SelectedIndex := 132;
  end;
  cbAddToTree2.Enabled := true;
  
  if WindowState = wsMinimized then ShowWindow(Handle, SW_RESTORE);
  if PortScanHasItem then AddIpAddrRange(edtScanIP1.Text, edtScanIP2.Text);
  
end;

procedure TToolsForm.btnScanPortClick(Sender: TObject);
var
  ScanThread: TScanTcpPortThread;
begin

  if btnScanPort.Tag = 0 then
  begin
    PortScanHasItem := false;
    btnScanPort.Tag := 1;
    btnScanPort.Caption := '停止';

    if (not IsLegalIP(edtScanIP1.Text))or(not IsLegalIP(edtScanIP2.Text))  then
    begin
      ShowMessage('IP地址非法,请重新输入');
      //Application.MessageBox('IP地址非法,请重新输入。', '网络工具', 0);
      exit;
    end;

    if rbUseFromTo.Checked then
    ScanThread := TScanTcpPortThread.Create(edtScanIP1.Text, edtScanIP2.Text,
          strtoint(cbScanPort1.Text), strtoint(cbScanPort2.Text), spTimeOut.Value)
    else
    ScanThread := TScanTcpPortThread.Create(edtScanIP1.Text, edtScanIP2.Text,
          0, clbPort.Items.Count-1, spTimeOut.Value);

    ScanThread.OnSendEvent := PortShowProgress;
    ScanThread.OnConnectEvent := PortOnConnect;
    ScanThread.OnExitEvent := PortOnExitScan;
    ScanThread.Resume;

    cbAddToTree2.Enabled := false;
    if cbAddToTree2.Checked then
    begin
      MainForm.IpTree.Items[0].ImageIndex := 133;
      MainForm.IpTree.Items[0].SelectedIndex := 133;
    end;

    //btnScanPort.Enabled := false;
    edtScanIP1.Enabled := false;
    edtScanIP2.Enabled := false;
    cbScanPort1.Enabled := false;
    cbScanPort2.Enabled := false;
    spTimeOut.Enabled := false;
    rbUseFromTo.Enabled := false;
    rbUseList.Enabled := false;
    exit_tcp_port_scan := false;
  end
  else
  begin
    btnScanPort.Tag := 0;
    btnScanPort.Caption := '开始';
    exit_tcp_port_scan := true;

    if PortScanHasItem then AddIpAddrRange(edtScanIP1.Text, edtScanIP2.Text); //
  end

end;

procedure TToolsForm.lvPortScanDblClick(Sender: TObject);
var
  Exe   : TExecuteThread;
begin

  if lvPortScan.Selected <> nil then
  begin
    if lvPortScan.Selected.SubItems[0] = '80' then
    begin
      //ExecuteFile('http://'+lvPortScan.Selected.Caption,'','',1);
      Exe:=TExecuteThread.Create(true);
      Exe.ExeFile := 'http://'+lvPortScan.Selected.Caption;
      Exe.ExeDir := '';
      Exe.FreeOnTerminate := true;
      Exe.Resume;
    end
    else
    if lvPortScan.Selected.SubItems[0] = '21' then
    begin
      //ExecuteFile('ftp://'+lvPortScan.Selected.Caption,'','',1);
      Exe:=TExecuteThread.Create(true);
      Exe.ExeFile := 'ftp://'+lvPortScan.Selected.Caption;
      Exe.ExeDir := '';
      Exe.FreeOnTerminate := true;
      Exe.Resume;
    end
    else
    if lvPortScan.Selected.SubItems[0] = '23' then
    begin
      WinExec(pchar('telnet '+lvPortScan.Selected.Caption), 1);
    end
    else
    if lvPortScan.Selected.SubItems[0] = '139' then
    begin
      with MainForm do
      begin
        LeftPageCtrl.ActivePageIndex := 2;
        Edit1.Text := trim(lvPortScan.Selected.Caption);
        BtnFindClick(Self);
      end;
    end
  end;
  
end;

procedure TToolsForm.PageCtrlChange(Sender: TObject);
begin

  case PageCtrl.ActivePageIndex of
    0:
    begin
      CurListView := IPListView;
    end;
    1:
    begin
      CurListView := lvNbt;
    end;
    2:
    begin
      CurListView := lvPortScan;
    end;
    3:
    begin
      CurListView := lvPing;
    end;
    5:
    begin
      CurListView := lvNbtDb;
    end;
    6:
    begin
      CurListView := lvIpAddr;
    end
  end; // end of case

end;

procedure TToolsForm.PingReply(Sender: TObject);
var
  r             : TPingReply;
  item          : TListItem;
  
  host          : string;
  TemNode       : TTreeNode;
  MyItemPtr     : PMyTreeItem;
begin

  PingHasItem := true;
  r := TPingReply(Sender);
  item := lvPing.Items.Insert(0);
  item.Caption := r.IP;
  //Memo1.Lines.Add(r.IP + ' ' + R.bytes + ' ' + R.RTT);

  if cbAddToTree3.Checked then
  with MainForm do
  begin
    LeftPageCtrl.ActivePageIndex := 0;
    SearchPageCtrl.ActivePageIndex := 1;
    host := '\\' + r.IP;
    New(MyItemPtr);
    TemNode := IpTree.Items.AddChild(IpTree.Items[0], host);
    TemNode.ImageIndex := 7;
    TemNode.SelectedIndex := 7;
    IpTree.Items[0].Expand(false);
    MyItemPtr^.group := IpTree.Items[0].Text;
    MyItemPtr^.dirName := host;
    TemNode.Data := MyItemPtr;
  end;

end;

procedure TToolsForm.PingBegin(Sender: TObject);
begin
  //btnPing.Enabled := false;
  edtPing1.Enabled := false;
  edtPing2.Enabled := false;
  spPingTime.Enabled := false;
end;

procedure TToolsForm.PingEnd(Sender: TObject);
begin
  //btnPing.Enabled := true;
  btnPing.Tag := 0;
  btnPing.Caption := '开始';
  edtPing1.Enabled := true;
  edtPing2.Enabled := true;
  spPingTime.Enabled := true;

  if cbAddToTree3.Checked then
  begin
    MainForm.IpTree.Items[0].ImageIndex := 132;
    MainForm.IpTree.Items[0].SelectedIndex := 132;
  end;
  cbAddToTree3.Enabled := true;

  if WindowState = wsMinimized then ShowWindow(Handle, SW_RESTORE);
  if PingHasItem then AddIpAddrRange(edtPing1.Text, edtPing2.Text);
end;

procedure TToolsForm.PingSend(Sender: TObject);
begin
  Label16.Caption := string(Sender);
end;

procedure TToolsForm.btnPingClick(Sender: TObject);
var
  PingThread: TPingThread;
begin

  if btnPing.Tag = 0 then
  begin
    PingHasItem := false;
    btnPing.Tag := 1;
    btnPing.Caption := '停止';
    exit_ping_thread := false;

    if (not IsLegalIP(edtPing1.Text))or(not IsLegalIP(edtPing2.Text))  then
    begin
      ShowMessage('IP地址非法,请重新输入');
      //Application.MessageBox('IP地址非法,请重新输入。', '网络工具', 0);
      exit;
    end;

    cbAddToTree3.Enabled := false;
    if cbAddToTree3.Checked then
    begin
      MainForm.IpTree.Items[0].ImageIndex := 133;
      MainForm.IpTree.Items[0].SelectedIndex := 133;
    end;

    PingThread := TPingThread.Create(edtPing1.Text, edtPing2.Text, spPingTime.Value);
    PingThread.OnRecvEvent := PingReply;
    PingThread.OnSendEvent := PingSend;
    PingThread.OnBeginEvent := PingBegin;
    PingThread.OnEndEvent := PingEnd;
    PingThread.Resume;
  end
  else
  begin
    btnPing.Tag := 0;
    btnPing.Caption := '开始';
    exit_ping_thread := true;

    if PingHasItem then AddIpAddrRange(edtPing1.Text, edtPing2.Text); //
  end

end;

procedure TToolsForm.lvPingDblClick(Sender: TObject);
begin
  if lvPing.Selected <> nil then
  with MainForm do
  begin
    LeftPageCtrl.ActivePageIndex := 2;
    Edit1.Text := trim(lvPing.Selected.Caption);
    BtnFindClick(Self);
  end;
end;

procedure TToolsForm.SendMsgResultEvent(Sender: TObject);
begin
  //lbResult.Items.Insert(0, string(Sender));
  beep;
  if WindowState = wsMinimized then ShowWindow(Handle, SW_RESTORE);
end;

procedure TToolsForm.btnSendMsgClick(Sender: TObject);
var
  SendMsgThread: TSendMsgThread;
  item: TListItem;
begin
  SendMsgThread := TSendMsgThread.Create(true);
  SendMsgThread.From := '';
  SendMsgThread.ToHost := cbToHost.Text;
  SendMsgThread.Msg := memMsg.Text;
  SendMsgThread.OnResultEvent := SendMsgResultEvent;
  SendMsgThread.FreeOnTerminate := true;

  item := lvSendMsg.Items.Insert(0);
  item.Caption := cbToHost.Text;
  item.SubItems.Add(memMsg.Text);
  item.SubItems.Add('正在发送');
  SendMsgThread.MyListItem := item;

  SendMsgThread.Resume;

  if cbToHost.Items.IndexOf(cbToHost.Text) = -1 then cbToHost.Items.Add(cbToHost.Text);
  if cbClearMsg.Checked then memMsg.Clear;
end;

procedure TToolsForm.FormDestroy(Sender: TObject);
begin
  //cbToHost.Items.SaveToFile(AppDir+'SendToHost.txt');
  if (not MainForm.bNotAutoSaveNbt) then SaveNbtData;

  SaveIpRange;
  //SaveFavoRange;
  SaveList;
end;

procedure TToolsForm.lvSendMsgDblClick(Sender: TObject);
begin
  if lvSendMsg.Selected <> nil then memMsg.Text := lvSendMsg.Selected.SubItems[0];
  //windows.beep(2000, 2000);
end;

procedure TToolsForm.btnSearchFieldClick(Sender: TObject);
var

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -