回 帖 发 新 帖 刷新版面

主题:显示密码编辑框中的密码

我们在使用Windows时,经常会碰到一些密码编辑框,输入其中的文字都以“*”显示。现在,有许多共享软件和自由软件都可以实现隐藏密码的正确显示。究竟这是怎样实现的呢!其实,这比较简单,虽然这些信息都以“*”显示,但其内部还是以当初的字符表示,所以,我们只要用Windows API函数就可以实现。
  在Windows中,每一个窗口、控件都有它的名字(叫做Name或Window Text)。对于Form、Dialog Box、Message Box来说,名字就显示在Title Bar中;对于Edit、Button、Static Control,名字显示在他所占的区域中。密码编辑框本身就是个Edit控件,虽然显示的是特殊字符,但名字属性没有变,还是输入时的字符。Windows提供了两个API函数来获得这个名字:
  int GetWindowTextLength(HWND hWnd); // 得到名字的长度
   其中,hWnd :想要得到的那个窗口或控件的句柄 handle
  int GetWindowText(HWND hWnd, LPTSTR lpString, int nMaxCount );// 得到名字
  其中,hWnd :想要得到的那个窗口或控件的句柄 handle;
  lpString:存放名字的字符串的地址
  nMaxCount :可拷贝的最大字符数
 
  新建一Form,放置Label、Edit、Button各一个到Form中,将Edit1的PasswordChar属性改为“*”,双击Button1:
  procedure TForm1.Button1Click(Sender: TObject);
  var
  Name:PChar; // 名字
  L:integer; // 名字的长度
  begin
  L:=GetWindowTextLength(Edit1.handle)+1; // 得到名字长度,并将长度加1
  GetMem(Name,L);//为将要得到的名字分配内存
  GetWindowText(Edit1.handle,Name,L);//得到名字
  label1.Caption:=String(Name); // 将得到的名字显示于 Label1
  FreeMem(Name,0); // 释放分配的内存
  end;
  经过运行,在Edit1中输入的密码就可通过Label1显示出来。

回复列表 (共6个回复)

沙发

看看这个吧比你的好   ^_^
[url]http://www.programfan.com/down/pwdspy.zip[/url]

板凳

确实可以,帮我解决了一个问题.请加我:QQ:45359192
                   ICQ:220288541

3 楼

我已经加了你的QQ
我的是119687116
大家一起交流!

4 楼

多谢了,但是你上面有非法字符。直接复制上去不能用。害我弄了好久~~!

5 楼

编程爱好者里不是有吗?在源码区里,叫Password Spy,我刚刚看过人家的源码,好像比你的简单:

unit MainFrm;

interface

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

type
  TMainForm = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    HandleEdit: TEdit;
    ClassEdit: TEdit;
    TextEdit: TEdit;
    OnTopCheckBox: TCheckBox;
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure OnTopCheckBoxClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.DFM}

function GetWorkAreaRect: TRect;
begin
  SystemParametersInfo(SPI_GETWORKAREA, 0, @Result, 0);
end;

procedure SetStayOnTop(Form: TForm; Value: Boolean);
begin
  if Value Then
    SetWindowPos(Form.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
  else
    SetWindowPos(Form.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE);
end;

procedure TMainForm.FormCreate(Sender: TObject);
var
  R: TRect;
begin
  R := GetWorkAreaRect;
  Left := R.Right - Width;
  Top := R.Bottom - Height;
  SetStayOnTop(Self, True);
end;

procedure TMainForm.TimerTimer(Sender: TObject);
var
  Pos: TPoint;
  Handle: HWND;
  Buf: array[0..1024] of Char;
begin
  GetCursorPos(Pos);
  Handle := WindowFromPoint(Pos);
  HandleEdit.Text := IntToStr(Handle);
  GetClassName(Handle, Buf, 1024);
  ClassEdit.Text := Buf;
  SendMessage(Handle, WM_GETTEXT, 1024, Integer(@Buf));
  TextEdit.Text := Buf;
end;

procedure TMainForm.OnTopCheckBoxClick(Sender: TObject);
begin
  SetStayOnTop(Self, OnTopCheckBox.Checked);
end;

end.

6 楼

好是好但现在都是用XP拉,一般的密码符号都是●拉
[转载]密码输入也XP

  大家知道,在XP风格下,密码输入时显示如“●●●”圆形状态,那么DELPHI中是如何实现这样的效果呢?
  在delphi中TEDIT中的passchar是不支持●字符的,只能是显示如*等字符。那么只有是另寻途经了,首先在EDIT中KeyPress过程,取得用户从键盘输入的字符并把它送到另一个变量中,然后,要将刚刚输入的字符清除(否则会显示出输入的内容),这样既可获取用户输入的内容,又让EDIT控件不显示出来,此时,我们在EDIT控件中加入“●”符号,就可以实现上述的XP风格了。
举例如下:(我们以myInputPwd为存放密码的变量)
procedure TfrmLogin.EDIT1KeyPress(Sender: TObject; var Key: Char);
begin
myInputPwd:=MyInputPwd + Key;
Key:=#0;
EDIT1.Text:=EDIT1.Text +'●';
end;
不过,值得一提的是,这时进行密码校验时,一定要取MyinputPwd这一变量了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册