显示密码编辑框中的密码!急急

19990909 2003-02-10 07:39:41
急。
最好是原理和代码。
...全文
25 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sysu 2003-02-10
  • 打赏
  • 举报
回复
若是在2000/XP下则要用到钩子,原理和方法参见:
http://www.csdn.net/develop/article/16/16452.shtm
qiqi97 2003-02-10
  • 打赏
  • 举报
回复
楼上的说的很清楚啦
其实就是SendMessage,用他来返回原始文字
Billy_Chen28 2003-02-10
  • 打赏
  • 举报
回复
procedure TForm1.Timer1Timer(Sender: TObject);
var
p: TPoint;
hwnd: integer;
buf: array[0..1023] of char;
begin
Windows.GetCursorPos(p);
hwnd := WindowFromPoint(p);
if hwnd<>0 then
begin
SendMessage(hwnd,WM_GETTEXT,1023,Integer(@buf[0]));
Label1.text := strpas(buf);
end;
end;



Billy_Chen28 2003-02-10
  • 打赏
  • 举报
回复
{-------------------------------------------------------------------------------}
{系统的回调过程,在本过程内发送显示/隐藏密码的消息}
function EnumChildWindowsProc(hwnd: Integer; lparam: Longint): Boolean; stdcall;
var
buffer: array[0..255] of Char;
begin
GetClassName(hwnd, buffer, 256);
//if StrPas(Buffer) = 'TEdit' then //找TEdit控件
begin
if lparam = 0 then
PostMessage(hwnd, EM_SETPASSWORDCHAR, longint(0), 0)
else
PostMessage(hwnd, EM_SETPASSWORDCHAR, longint('*'), 0);

InvalidateRgn(hwnd, 0, True);
Result := True; //终止循环
end;
end;

{-------------------------------------------------------------------------------}
{显示/隐藏所有窗体密码,本部分枚举所有窗体}
procedure ShowAll(lparam: Integer);
var
Window_Handle, Hand: Integer;
begin
Window_Handle := GetWindow(Application.Handle, GW_HWNDFIRST);
while Window_Handle <> 0 do
begin
if Window_Handle <> 0 then
begin
EnumChildWindows(Window_Handle, @EnumChildWindowsProc, lparam);
end;
Window_Handle := GetWindow(Window_Handle, GW_HWNDNEXT);
end;
end;

{-------------------------------------------------------------------------------}
{响应按键}
procedure TFrm_ShowPass.sbtn_ShowPassClick(Sender: TObject);
begin
ShowAll(0);
end;

procedure TFrm_ShowPass.sbtn_hidePassClick(Sender: TObject);
begin
ShowAll(1);
end;
grail_ 2003-02-10
  • 打赏
  • 举报
回复
密码编辑框本身就是个Edit控件,虽

然显示的是特殊字符,但名字属性没有变,还是输入时的字符。Windows提供了两个API

函数来获得这个名字:

int GetWindowTextLength(HWND hWnd); // 得到名字的长度

其中,hWnd :想要得到的那个窗口或控件的句柄 handle

int GetWindowText(HWND hWnd

LPTSTR lpString

int nMaxCount );// 得到

名字

其中,hWnd :想要得到的那个窗口或控件的句柄 handle;

lpString:存放名字的字符串的地址

nMaxCount :可拷贝的最大字符数

下面以Delphi为例,说明它的实现过程。

新建一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;

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧