开发一个密码查看器

2008-04-09 04:25:41来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

现在有很多软件都有密码输入对话框。上面显示的是*标识符。如果想查看其字符串并不难。下面我们就用delphi使用API函数来开发一个查看其密码字符的程序吧。

功能:当鼠标移动到密码处就会在程序的指定地方显示其字符串。

问题一:当鼠标移动到密码对话框处时查找出此处的控件句柄。这样才可以对这个对象进行操作.具体实现如下:

function gethwnd(): thandle;
var
hwnd: thandle;
wndpoint: tpoint;
begin
try
GetCursorPos(wndpoint); //获取鼠标指针
hwnd:=WindowFromPoint(wndpoint);
Result:=wndpoint
except
Result:=0;
end;
end;

问题二: 根据获取的句柄得到此对象的密码字符。具体实现如下:

function getpass(var hwnd: thandle): string;
var
passbuf: integer;
passlong: longint;
passText: PChar;
begin
passlong:=SendMessage(hwnd,WM_GETTEXTLENGTH,0,0) 1; //获取此对象的长度
GetMem(passText,passlong); //开辟一个内存区。存放数据长度为passlong
passbuf:=LongInt(passtext); //获取此数据区的首地址
SendMessage(hwnd,WM_GETTEXT,passlong,passbuf); //发送消息让此对象将密码数据存入首地址为passbuf的数据区。存入长度为passlong
result:=passtext;
end;

这样主要问题都解决了。还可以使用GetClassName,GetWindowText等API函数将此对象的类、标题等都读出来。以下是源代码,在delphi6.0 winXP测试通过,仅供参考。


{-----------------------------pas内容--------------------------------------}
unit getwnd;

interface

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

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Timer1: TTimer;
Label5: TLabel;
Label6: TLabel;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
Shape1: TShape;
Shape2: TShape;
Shape3: TShape;
Shape4: TShape;
N2: TMenuItem;
procedure Timer1Timer(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
procedure N2Click(Sender: TObject);
private
{ Private declarations }
public
procedure Createparams(Var Params:TCreateParams);override;
{ Public declarations }
end;

var
Form1: TForm1;
hwnd,htemp:THandle;
point,mouse:TPoint;
wndcaption:array[0..255] of char;
wndclass:array[0..255] of char;
fmove: boolean;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
buf: integer;
ret: longint;
mText:PChar;
begin
GetCursorPos(point);
htemp:=WindowFromPoint(point);
if hwnd<>htemp then
begin
hwnd:=htemp;
GetClassName(hwnd,wndclass,256);
GetWindowText(hwnd,wndcaption,256);
if wndcaption='''''''' then
begin
Ret:=SendMessage(hwnd,WM_GETTEXTLENGTH,0,0) 1;
GetMem(mText,Ret);
buf:=LongInt(mtext);
SendMessage(hwnd,WM_GETTEXT,ret,buf);
label4.Caption:=mText;
end else
label4.Caption:=wndcaption;
label3.Caption:=inttostr(hwnd);
label6.Caption:=wndclass;
end;

end;

procedure TForm1.N1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
fmove:=true;
mouse.X:=x;
mouse.Y:=y;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
fmove:=false;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if fmove then
begin
top:=top y-mouse.Y;
left:=left x-mouse.X;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
left:=screen.Width-width-3;
top :=screen.Height-height-34;
end;

procedure TForm1.Createparams(var Params: TCreateParams);
var
wndParnet: THandle;
begin
Inherited CreateParams(Params);
With Params do
begin
EXStyle:=ExStyle or WS_EX_TOPMOST OR WS_EX_ACCEPTFILES;
wndParnet:=GetDesktopWindow;
end;

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:编辑框和位图按钮的特殊结合

下一篇:如何制作平面式列头的Listview