win7 下星号密码查看如何实现的?

doudou070801 2011-01-25 11:08:06

1. 创建一个VCL Application工程,打开Form1.pas文件,加入下面的全局变量和鼠标钩子函数。

var
HookHandle: HHOOK;

function HookProc(code: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
MousePoint: TPoint;
WindowHandle: THandle;
WindowStyle: Longint;
begin
// 获取鼠标位置
GetCursorPos(MousePoint);

// 获取包含鼠标的窗口句柄
WindowHandle := WindowFromPoint(MousePoint);

// 获取窗口风格
WindowStyle := GetWindowLong(WindowHandle, GWL_STYLE);

if TEventMsg(PEventMsg(lParam)^).message = WM_LBUTTONDOWN then
begin
// 是否为密码框
if WindowStyle and ES_PASSWORD <> 0 then
begin
// 去掉密码属性
PostMessage(WindowHandle, EM_SETPASSWORDCHAR, 0, 0);
end;
end;

Result := CallNextHookEx(HookHandle, code, wParam, lParam);
end;需要注意的是,程序中PostMessage(WindowHandle, EM_SETPASSWORDCHAR, 0, 0);只能使用PostMessage,而不能使用SendMessage代替。

2. 在Form1窗体上放下两个Button控件。并在他的单击事件中加入如下代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
UnhookWindowsHookEx(HookHandle);
end;


可是,这段代码在 WIN7 无效。。。 我在网上看见有些星号密码查看器WIN7下有效,请问如何实现的呢?
...全文
2524 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
kayoo 2011-02-09
  • 打赏
  • 举报
回复
GetWindowText……
kye_jufei 2011-02-07
  • 打赏
  • 举报
回复
權限問題,必要時要用管理員身份登錄取得。。如右鍵管理員登錄。。。
doudou070801 2011-01-27
  • 打赏
  • 举报
回复
我只是举例说例如宽带密码。。

http://www.skycn.com/soft/61747.html

这是天空软件上的一个支持WIN7的星号密码查看。如果查看不了,可尝试使用管理员权限运行程序即可。。
不知道他是怎么做到的!~~
ysai 2011-01-27
  • 打赏
  • 举报
回复
很简单,宽带密码取不到
win7下所有系统的密码输入框都应该取不到
win7宣传的安全性不是吹出来的

取宽带密码有几个软件可以,是直接读注册表里加密后的数据,解密出来的,算法未知
JPEXE 2011-01-26
  • 打赏
  • 举报
回复
主要都是API的调用,你自己单调试一下,看看是哪一步调用失败了(GetLastError),同时仔细查查MSDN,有不少API针对Vista和Win7系统引入了新的参数值,要注意。
doudou070801 2011-01-26
  • 打赏
  • 举报
回复
试了管理员运行。

我自己用 D7 做个窗口放个 EDIT 上去之后,修改EDIT PASSWORDCHAR 为 * ,取名程序为 demo.

情况1:正常运行 DEMO,星号查看器可以显示出来输入框内容。
情况2:管理员身份运行 DEMO,也用管理员身份启动星号密码显示程序才能显示 DEMO 输入框里的内容。

但是,以管理员身份运行星号查看器还是显示不了例如宽带密码这些。 XP 下都可以的!
JPEXE 2011-01-26
  • 打赏
  • 举报
回复
有没有试过以“管理员身份运行”?
doudou070801 2011-01-26
  • 打赏
  • 举报
回复
那如果不是 UIPI ,为什么我用个D7 自己搞的一个 DEMO 在 WIN7 下就可以了呢?
doudou070801 2011-01-26
  • 打赏
  • 举报
回复

PostMessage(WindowHandle, EM_SETPASSWORDCHAR, 0, 0);


就是这句无效。
ysai 2011-01-26
  • 打赏
  • 举报
回复
UIPI只是限制你的程序往更高级权限的程序发消息,如果是同样的权限,就跟这个没关系的
大不了右键管理员身份执行呗
doudou070801 2011-01-26
  • 打赏
  • 举报
回复
问题:
例如我用 D7 自己建立一个普通程序,放个EDIT框在上边,设置PASSWORDCHAR 属性为 * 后,在 WIN7 下用星号查看器可以。。
但是,有些例如宽带密码之类的,都不可以了。。
用上边的程序返回发现密码框属性没有变动。。

好像是 UIPI WIN7 的特性原因。 在查相关资料。。
doudou070801 2011-01-26
  • 打赏
  • 举报
回复

procedure TForm1.Timer1Timer(Sender: TObject);
var
MousePoint: TPoint;
WindowHandle: THandle;
WindowStyle: Longint;
begin
// 获取鼠标位置
GetCursorPos(MousePoint);
// 获取包含鼠标的窗口句柄
WindowHandle := WindowFromPoint(MousePoint);

// 获取窗口风格
WindowStyle := GetWindowLong(WindowHandle, GWL_STYLE);

PostMessage(WindowHandle, EM_SETPASSWORDCHAR, 0, 0);
// 是否为密码框
if WindowStyle and ES_PASSWORD <> 0 then Edit1.Text:= '还是密码框' else Edit1.Text:= '不是密码框'
doudou070801 2011-01-26
  • 打赏
  • 举报
回复
就同样的程序,XP 下能取到,WIN7 下取不到。。
查了资料,好像 WIN7 的 UIPI 机制吧!
ysai 2011-01-26
  • 打赏
  • 举报
回复
我的怎么有效?
另外,有的密码框是做过特殊处理的,无法取到密码,比如SQL SERVER的密码输入框什么的
doudou070801 2011-01-26
  • 打赏
  • 举报
回复

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function GetWindowText(
const HWnd : HWnd;
const GetPassWord : Boolean = False
):string;
//取得文本且可以取得密码
var
iPwdChar : Integer;
iPwdLast : Integer;
psText : array[0..MAXBYTE] of char;
i : Integer;
begin
Result := '';
if Hwnd = 0 then Exit;
iPwdChar:=SendMessage(HWnd, EM_GETPASSWORDCHAR, 0, 0);
if iPwdChar<>0 then
begin
iPwdLast := 0;
i := 0;

while iPwdLast = 0 do
begin
PostMessage(HWnd, EM_SETPASSWORDCHAR, 0, 0);
Application.ProcessMessages;
Inc(i);
iPwdLast := SendMessage(HWnd, EM_GETPASSWORDCHAR, 0, 0);
if i > 100 then break;
end ;

SendMessage(HWnd, WM_GETTEXT, MAXBYTE, Longint(@psText));
Result := StrPas(psText);
SendMessage(HWnd, EM_SETPASSWORDCHAR, iPwdChar, 0);
end
else begin
SendMessage(HWnd, WM_GETTEXT, MAXBYTE, Longint(@psText));
Result := StrPas(psText);
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
MousePoint: TPoint;
WindowHandle: THandle;
//WindowStyle: Longint;
begin
// 获取鼠标位置
GetCursorPos(MousePoint);
// 获取包含鼠标的窗口句柄
WindowHandle := WindowFromPoint(MousePoint);
// 去掉密码属性
Edit1.Text:=GetWindowText(WindowHandle,true);
end;

end.


没有用钩子了,改用定时器,1秒检测一次鼠标处句柄。。
采用楼上提供的函数,同样只支持XP,WIN7 下无效!
ysai 2011-01-26
  • 打赏
  • 举报
回复
别用钩子就行了
function GetWindowText(
const HWnd : HWnd;
const GetPassWord : Boolean = False
):string;
//取得文本且可以取得密码
var
iPwdChar : Integer;
iPwdLast : Integer;
psText : array[0..MAXBYTE] of char;
i : Integer;
begin
Result := '';
if Hwnd = 0 then Exit;
iPwdChar:=SendMessage(HWnd, EM_GETPASSWORDCHAR, 0, 0);
if iPwdChar<>0 then
begin
iPwdLast := 0;
i := 0;

while iPwdLast = 0 do
begin
PostMessage(HWnd, EM_SETPASSWORDCHAR, 0, 0);
Application.ProcessMessages;
Inc(i);
iPwdLast := SendMessage(HWnd, EM_GETPASSWORDCHAR, 0, 0);
if i > 100 then break;
end ;

SendMessage(HWnd, WM_GETTEXT, MAXBYTE, Longint(@psText));
Result := StrPas(psText);
SendMessage(HWnd, EM_SETPASSWORDCHAR, iPwdChar, 0);
end
else begin
SendMessage(HWnd, WM_GETTEXT, MAXBYTE, Longint(@psText));
Result := StrPas(psText);
end;
end;

1,183

社区成员

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

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