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 + -
显示快捷键?