pingmain.pas

来自「这个是Delphi 2007下写的」· PAS 代码 · 共 222 行

PAS
222
字号
unit PingMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,
  uPassARP, uPingThread;

type
  TfrmPingMAC = class(TForm)
    Panel1: TPanel;
    PanelIP: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit_Gateway: TEdit;
    Edit_Start: TEdit;
    Edit_End: TEdit;
    Button1: TButton;
    Panel2: TPanel;
    Panel3: TPanel;
    Label4: TLabel;
    Edit_ThreadCount: TEdit;
    Panel4: TPanel;
    Label5: TLabel;
    Edit_TimeOut: TEdit;
    Label6: TLabel;
    CheckBox_waitARP: TCheckBox;
    ListBox1: TListBox;
    Panel5: TPanel;
    Edit_SIP: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    Edit_SMAC: TEdit;
    Label9: TLabel;
    Edit_SLHEX: TEdit;
    EditSelect: TEdit;
    Label10: TLabel;
    procedure Edit_GatewayKeyPress(Sender: TObject; var Key: Char);
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure CheckBox_waitARPClick(Sender: TObject);
    procedure ListBox1DblClick(Sender: TObject);
    procedure Edit_SIPClick(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure EditSelectKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
    fBaseIP: String;
    IPMACSeeker: TIPMACSeeker;
    procedure OnSeekerProcess(var aMsg: TMessage); message WM_PINGPROCESS;
    procedure OnPingMessage(var aMsg: TMessage); message WM_STRINFO;
  public
    { Public declarations }
    function GetBaseIP(): String;
  end;

var
  frmPingMAC: TfrmPingMAC;

implementation

{$R *.dfm}

procedure TfrmPingMAC.ListBox1Click(Sender: TObject);
var
  tmpStr: String;
  Index: Integer;
begin
  if ListBox1.ItemIndex < 0 then Exit;
  tmpStr := ListBox1.Items.Strings[ListBox1.ItemIndex];
  // 格式选择的行 源格式:'%-15s| %-16s  (%s)'
  Edit_SIP.Text := Trim(Copy(tmpStr, 1, 15));

  Index := IPMACSeeker.IPList.IndexOf(Edit_SIP.Text);
  if Index >= 0 then
  with IPMACSeeker do
  begin
    Edit_SLHEX.Text := InttoHex(Index, 2);
    Edit_SMAC.Text := StringReplace(MACList.Strings[Index], '-', ' ', [rfReplaceAll]);
  end;
end;

procedure TfrmPingMAC.ListBox1DblClick(Sender: TObject);
begin
  if ListBox1.Items.Count > 0 then
  begin
    ListBox1.Items.SaveToFile('.\dump.txt');
    Self.Caption := '已导出到文件dump.txt';
  end;
end;

procedure TfrmPingMAC.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  (Sender as TButton).Enabled := False;
  Edit_ThreadCount.Enabled := False;

  // 扫描MAC地址
  fBaseIP := GetBaseIP();
  IPMACSeeker.Init(fBaseIP, StrtoInt(Edit_Start.Text), StrtoInt(Edit_End.Text),
                   StrtoInt(Edit_ThreadCount.Text));

  ListBox1.Items.Clear;
  for i := 0 to IPMACSeeker.Count - 1 do
  begin
    // 去掉不要的标识
    if (IPMACSeeker.IPInfo.Strings[i] = '未知') then Continue;     // 未Ping过
    if (IPMACSeeker.IPInfo.Strings[i] = '超时') then Continue;     // 没有响应
    if (IPMACSeeker.IPInfo.Strings[i] = '无效') then Continue;     // MAC地址全0

    ListBox1.Items.Add(Format('%-15s| %-16s  (%s)' ,
                          [IPMACSeeker.IPList.Strings[i],
                           IPMACSeeker.MACList.Strings[i],
                           IPMACSeeker.IPInfo.Strings[i]]));
  end;
  Label6.Caption := Format('活动主机:%d   ', [ListBox1.Items.Count]);

  (Sender as TButton).Enabled := True;
  Edit_ThreadCount.Enabled := True;
  Self.Caption := '获取完成!';
end;

procedure TfrmPingMAC.CheckBox_waitARPClick(Sender: TObject);
begin
  IPMACSeeker.WaitARP := CheckBox_waitARP.Checked;
end;

procedure TfrmPingMAC.Edit_SIPClick(Sender: TObject);
begin
  (Sender as TEdit).SelectAll;
  (Sender as TEdit).CopyToClipboard;
end;

procedure TfrmPingMAC.EditSelectKeyPress(Sender: TObject; var Key: Char);
var
  tmpMac: String;
  Index: Integer;
begin
  if Key = #13 then
  begin
    // 修正输入
    tmpMac := StringReplace(Trim((Sender as TEdit).Text), ' ', '-', [rfReplaceAll]);
    (Sender as TEdit).Text := '';

    Index := IPMACSeeker.MACList.IndexOf(tmpMac);
    // 查询输入的MAC地址
    if Index >= 0 then
    with IPMACSeeker do
    begin
      Edit_SIP.Text := IPList.Strings[Index];
      Edit_SLHEX.Text := InttoHex(Index, 2);
      Edit_SMAC.Text := StringReplace(MACList.Strings[Index], '-', ' ', [rfReplaceAll]);

      ListBox1.ItemIndex := ListBox1.Items.IndexOf(
                              Format('%-15s| %-16s  (%s)',
                                      [IPList.Strings[Index],
                                       MACList.Strings[Index],
                                       IPInfo.Strings[Index]]));

      Key := #0;
    end;
  end;
end;

procedure TfrmPingMAC.Edit_GatewayKeyPress(Sender: TObject; var Key: Char);
begin
  if Not(Key in ['0', '1'..'9', '.', #8]) then
  begin
    Key := #0;
    Beep;
  end;
end;

procedure TfrmPingMAC.FormCreate(Sender: TObject);
begin
  IPMACSeeker := TIPMACSeeker.Create(Handle);
end;

procedure TfrmPingMAC.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  IPMACSeeker.Free;
end;

procedure TfrmPingMAC.OnSeekerProcess(var aMsg: TMessage);
begin
  if (aMsg.WParam = -2) and (aMsg.LParam = 0) then
    Self.Caption := Format('正在验证MAC信息...', [])
  else
    Self.Caption := Format('正在Ping:%s%d - %s%d',
                        [fBaseIP, aMsg.WParam-aMsg.LParam,
                         fBaseIP, aMsg.WParam-1]);
end;

procedure TfrmPingMAC.OnPingMessage(var aMsg: TMessage);
var
  tmpStr: String;
  Index: Integer;
begin
  tmpStr := StrPas(PChar(aMsg.LParam));
  Index := IPMACSeeker.IPList.IndexOf(tmpStr);
  if Index >= 0 then
    IPMACSeeker.IPInfo.Strings[Index] := StrPas(PChar(aMsg.WParam));
end;

function TfrmPingMAC.GetBaseIP(): String;
var
  tmpStr: String;
  Len: Integer;
begin
  tmpStr := Edit_Gateway.Text;
  Len := Length(tmpStr);
  while (tmpStr[Len] <> '.') do Dec(Len);
  Result := Copy(tmpStr, 1, Len);
end;


end.

⌨️ 快捷键说明

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