分享
 
 
 

如何获取编辑框中的密码

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

如何获取编辑框中的密码

作者:李安东

2002年5月25日

在众多的共享软件中,有一种小东东可能大家比较感兴趣——《获取编辑框中的密码》。实际上它的实现机理很简单,与获取任何一个窗口中的文字没有本质上的区别。但要获取另一个线程内的编辑框中的密码则稍微有点麻烦,关键是如何获取编辑框的句柄。下面介绍两种方法,供各位有兴趣的朋友参考。

第一种方法:获取鼠标指针法

这种方法的关键是获取当前鼠标指针指向的窗口的句柄。要获取当前鼠标指针的位置使用系统函数::GetCursorPos(&point)即可,参见MSDN中有关cursor的函数。实现步骤如下:

1、在对话框中建立一个定时器(间隔2秒),并在OnTimer函数中作如下操作:

2、在OnTimer(UINT nIDEvent)函数中调用系统函数::GetCursorPos(&point);

3、调用CWnd::WindowFromPoint(point)获取目标窗口的指针w(类型为CWnd*);

5、调用w->GetSafeHwnd( )得到该窗口的句柄hWnd;

6、调用::GetClassName()获取该窗口的类名,判断其类名是否是“Edit”。调用::GetWindowLong(hWnd,GWL_STYLE) 判断其窗口风格是否是ES_PASSWORD,以便确定是不是密码;

7、调用

::SendMessage(

(HWND) hWnd, // handle to destination window

WM_GETTEXT, // message to send

(WPARAM)55, // number of characters to copy

(LPARAM) sName // text buffer

);

获取目标窗口(编辑框)中的文本(密码)。

注意:用::GetWindowText()来获取另一个线程中编辑框中的文字是不行的,必须用SendMessage()。而反之用SendMessage()或::GetWindowText()来获取其他类型窗口的标题却都是可以的。

以下示例的功能是随着鼠标指针的移动,自动获取指针所指向的窗口中的文本(或密码),已调试通过。

void CGetpassDlg::OnTimer(UINT nIDEvent)

{

CPoint point;

::GetCursorPos(&point);

CWnd* w=CWnd::WindowFromPoint(point);

char sName[60];

HWND hWnd=NULL;

if(w!=NULL) hWnd=w->GetSafeHwnd( );

if(hWnd != NULL)

{

::GetClassName(hWnd,sName,55);

CString str(sName);

m_strprompt="这不是密码!(:-<";

if(str=="Edit" && ::GetWindowLong(hWnd,GWL_STYLE) & ES_PASSWORD)

m_strprompt="哈哈,密码找到啦!(:-)";

::SendMessage(

(HWND) hWnd, // handle to destination window

WM_GETTEXT, // message to send

(WPARAM)55, // number of characters to copy

(LPARAM) sName // text buffer

);

m_static_pass=sName;

}

UpdateData(FALSE);

CDialog::OnTimer(nIDEvent);

}

第二种方法:获取输入焦点法

这种方法的关键是获取具有键盘输入焦点的窗口的句柄:

1、在对话框中建立一个定时器(间隔2秒),并在OnTimer函数中作如下操作:

2、如果在Windows 95中,可以先用::GetForegroundWindow()获取用户当前工作的窗口句柄;

3、调用::GetWindowThreadProcessId(hWnd,NULL)获取该窗口所属的线程的标识;

4、调用::GetCurrentThreadId()获取当前线程的标识;

4、调用::AttachThreadInput()将自己的线程与另一个线程关联起来。据我的感觉在这个函数调用中,两个线程标识符在参数表中的先后顺序似乎无所谓;

5、调用:: GetFocus()函数即可获取当前具有键盘输入焦点的窗口句柄;

6、调用::GetClassName()获取该窗口的类名,判断其类名是否是“Edit”。调用::GetWindowLong(hWnd,GWL_STYLE) 判断其窗口风格是否是ES_PASSWORD,以便确定是不是密码;

7、如果该窗口类名是“Edit”,则调用

::SendMessage(

(HWND) hWnd, // handle to destination window

WM_GETTEXT, // message to send

(WPARAM)55, // number of characters to copy

(LPARAM) sName // text buffer

);

8、调用::AttachThreadInput()将自己的线程与另一个线程拆开。

如果在Windows 98 和 Windows NT 4.0 SP3 以上版本中,则用::GetGUIThreadInfo()可以获取系统中当前活动窗口的信息,例如:线程状态、活动窗口句柄、具有键盘输入焦点的窗口句柄、当前捕捉了鼠标输入的窗口句柄、拥有活动菜单的窗口的句柄、当前显示插字符的窗口句柄等。

注意:使用这个函数时,必须包含winable.h文件,而且“#include < winable.h >”指令不要放在stdafx..h中,应直接放在相应的C文件中。

示例代码较长,这里省略,请参阅下面的附录部分。

小结

上述方法实现的程序的特点是短小精悍,只有20多KB,如有朋友需要请来信。我认为第一种比较好,因为它简单。第二种方法用到别的程序里也许用处更大些。您如果有什么好主意,也不妨贡献出来让大家分享。

附录:

下面是第二种方法中OnTimer函数的示例代码(已调试通过):

void CGetpassDlg::OnTimer(UINT nIDEvent)

{

char sName[60]={0};

//when used for windows 98 or later environment:

#ifdef IN_WIN98_SYSTEM

GUITHREADINFO info;

info.cbSize=sizeof(info);

BOOL bl=::GetGUIThreadInfo(0,&info);

if(bl && info.hwndFocus != NULL)

{

::GetClassName(info.hwndFocus,sName,55);

CString str(sName);

m_strprompt="这不是密码!(:-<";

if(str=="Edit" && ::GetWindowLong(info.hwndFocus,GWL_STYLE) & ES_PASSWORD)

m_strprompt="哈哈,密码找到啦!:-)";

::SendMessage(

(HWND) info.hwndFocus, // handle to destination window

WM_GETTEXT, // message to send

(WPARAM)55, // number of characters to copy

(LPARAM) sName // text buffer

);

m_static_pass=sName;

}

#else

//when used for windows 95 environment:

DWORD curID,wID;

HWND hWnd=::GetForegroundWindow();

if(hWnd!=NULL)

{

curID=::GetCurrentThreadId();

wID=::GetWindowThreadProcessId(hWnd,NULL);

::AttachThreadInput(

wID, // thread to attach

curID, // thread to attach to

TRUE // attach or detach

);

hWnd=::GetFocus();

if(hWnd!=NULL) ::GetClassName(hWnd,sName,55);

CString str(sName);

m_strprompt="这不是密码!:-<";

if(str=="Edit" && ::GetWindowLong(hWnd,GWL_STYLE) & ES_PASSWORD)

m_strprompt="哈哈,密码找到啦!:-)";

::SendMessage(

(HWND) hWnd, // handle to destination window

WM_GETTEXT, // message to send

(WPARAM)55, // number of characters to copy

(LPARAM) sName // text buffer

);

m_static_pass=sName;

::AttachThreadInput(

wID, // thread to attach

curID, // thread to attach to

FALSE // attach or detach

);

}

#endif

UpdateData(FALSE);

CDialog::OnTimer(nIDEvent);

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有