如何获得远窗体中密码框类型的编辑框内容呢?

来源:百度知道 编辑:UC知道 时间:2024/06/13 23:17:11
我使用了多种方法,来在一个MFC窗体程序中,获取其他窗体进程中出现的、PasswordChar类型的编辑框内容,但是都失败了。我试验过这样的方法:
::GetWindow,获取窗体中指定类型的子控件。
::FindWindow,寻找窗体
::SendMessage,发送消息,用于获取EditBox和ComboBox的文本内容
::SetWindowHookEx,用于挂接其他线程,获取其相关信息

我用的HOOk是在本MFC中定义HOKPROC程序、第一个参数使用带_LL后缀的键盘类HOOk、第二个参数使用定义的函数名加上HOOKPROC类型转换、第三个参数使用本程序的进程句柄(以函数::AfxGetInstanceHandle()获得,亦可以用::GetModuleHandle()获得)、第四个参数使用0(表示所有进程,我也试过了使用::GetWindowProcessThreadID(hWnd,NULL)的方法,不过总是运行时导致目标程序出错退出,没有成功过)。
我没有使用DLL来承载HOOK的启动和HOOKPROC的定义,因为我认为在当前程序中是可以正确定义HOOKPROC和启动HOOK线程的。试验结果证实了可以使用这样的HOOK来监控整个系统的按键和鼠标点击信息,这时,::SetWindowHookEx的第一个参数为_LL后缀,第二个参数为本程序中定义的HOOKPROC首地址,第三个参数是本程序就进程句柄,以函数::AfxGetInstanceHandle()获得,第四个参数是0.
用你的方法试验还是失败了!
我是在同一个程序下面定义HOOKPROC函数的,把这个函数定义为窗体类的一个静态成员。第四个参数如果使用0,那么运行中导致系统蓝屏;如果使用目标窗体线程ID,那么运行中会导致目标窗体出错退出!不得行啊!
我已经使用过断点调试,运行中根本无法进入HOOKPROC,目标窗体就已经出错退出。所以,我就不再贴出代码了。
主程序建立HOOK的部分:
========
unsigned long desID,x;
desID=::GetWindowThreadProcessId(hdl,&x);//e

先纠正你的几处概念:是窗口线程,不是窗口进程;SetWindowsHookEx最后一个参数是线程ID,不是进程ID;Password样式的Edit窗口,也就是密码框,是不允许其他的进程发送WM_GETTEXT消息来获取它的内容的;
首先:*_LL类型的消息钩子,是低层的消息钩子,只能是全局范围内的,也就是SetWindowsHookEx最后一个参数只能是0,这种类型的钩子定义在Exe里,还是Dll里,效果一样;
如果你要获取指定密码框的文本,可以挂局部的WH_GETMESSAGE钩子,或者WH_CALLWNDPROC等等,都可以,只要是能够注入到目标进程的钩子就行;然后在钩子的消息处理过程中,再用GetWindowText函数来获取密码框的文本,因为此时的钩子过程是运行在目标线程所在的进程的上下文中,所以能够获取密码框的内容

CallWndProc? 这个函数的原型是怎么写的?看你在调用SetWindowsHookEx函数时用上了强制转换,大概猜测出你原型写错了。注意调用约定必须是__stdcall!还有,安装其他运行在其他进程的上下文中线程的WH_CALLWNDPROC消息钩子,必须定义在dll里,因为系统需要把钩子代码注入到目标进程的上下文中执行。你仔细看看MSDN。

安装钩子还会导致蓝屏?开玩笑吧,Ring3级的应用程序要能把Windows Nt 架构的OS弄蓝了,可不是几行代码就能搞定的。先看看你安装了什么主动防御软件之类的东西,禁用下看看。