句柄问题(100分)

  • 主题发起人 主题发起人 好好人
  • 开始时间 开始时间

好好人

Unregistered / Unconfirmed
GUEST, unregistred user!
要实现的功能:delphi程序中的edit内容复制到粘贴板(这很容易),然后将粘贴板中的
内容复制到网页中的指定输入框中怎么实现???即只要鼠标点击指定的输入框就自动把
粘贴板的内容复制到输入框内。
请高手指点。最好详细些。谢谢先!
 
没做过,
 
就像自动化测试工具一样在测试回放时自动的在指点框填入数据,高人们应该没有什么问题吧!
 
没做过

但我觉得可以在网页中处理输入框的click事件
 
不可能吧??
我给大家一点信息(我不指定怎么处理)不知道对解决这个问题是否有帮助
1、找到所在窗口的句柄,FindWindow或ENumWindows
2、枚举该窗口下所有子窗口的句柄,ENumChildWindows
3、对每一个子窗口加以判断,是否是你所要找的
 
看下面这个文章,也许对你有用。

通常情况下,在密码编辑框中输入的字符都用**(这里呼之为“星星”)来代替,以达到保护密码的目的。但看“星星”的工具并不比“星星”的个数少,由于其原理比较简单,初学者很容易制作一个。然而,有时天公不作美,它会给晴朗的星空抹上一道乌云,这时你就无法寻觅那颗明亮的星。网页中的“星星”就是一颗被掩盖的星。
透过密码编辑框看“星星”,主要是通过向密码编辑框发送WM_GETTEXT,获得密码编辑框的窗口文本,这种方法在Windows 9x/NT4/ME环境下屡试不爽,星星既属于你,又属于我,大家都可以看到。到了Windows 2K/XP环境,这招有些失灵,星星变聪明了,它只属于它中意的人,别的进程别想打它的主意。对于没有权限获得密码的进程,它会简单地返回一个ERROR_ACCESS_DENIED,来打发那些动机不纯或者别有用心的人们。但是还是有高手能够通过钩子函数,来笼络星星的心,钩子函数能够实现把一个动态连接库注入到另外一个进程,获取窗口文本,再返回给另外一个进程,面对这个吃里扒外的东西,不明真相的星星姑娘,居然听之任之,全抛一片心。
网页中的星星是一颗特别的星,铁石心肠,然而它却是豆腐作的。你很难获得它的窗口句柄,通过Visual Studio提供的SPY++也很难获得它的窗口句柄和它收到的窗口消息。获得网页中的密码必须通过必须通过HTML中的MSHTML文档对象模型。你首先必须通过各种方法获得Internet Explorer浏览器(Mr Navigate,Sorry)窗口句柄,判断它的类名是否是"Internet Explorer_Server",然后通过下述代码获得其文档对象模型指针,即IHTMLDocument2接口。

HWND hw;
MSHTML::IHTMLDocument2Ptr doc;
MSHTML::IHTMLElementCollectionPtr col;
MSHTML::IHTMLElementPtr EL;
DWORD lRes;
HRESULT hres;

UINT MSG = RegisterWindowMessage("WM_HTML_GETOBJECT");
SendMessageTimeout(hw, MSG, 0, 0,
SMTO_ABORTIFHUNG, 1000, &lRes);
hres=ObjectFromLresult(lRes, __uuidof(MSHTML::IHTMLDocument2), 0, (void**)&doc);

然后你必须获得鼠标屏幕坐标,把它转换成相对于客户区的坐标,然后根据坐标位置获得网页对对应的元素,查询IID_IHTMLInputTextElement接口指针,判断元素类型是否是一个密码编辑框,并获得对应密码。

CString GetPassword(IHTMLDocument2 *pDoc2,POINT pt)
{
if(pDoc2==NULL)return "";
CComPtr<IHTMLElement> pElement;
HRESULT hr=pDoc2->elementFromPoint(pt.x,pt.y,&pElement);
if(SUCCEEDED(hr)){
CComPtr<IHTMLInputTextElement> pPwdElement;
hr=pElement->QueryInterface(IID_IHTMLInputTextElement,
(void**)&pPwdElement);
if(SUCCEEDED(hr)){
CComBSTR type;
hr=pPwdElement->get_type(&type);
if(SUCCEEDED(hr)){
if(type==_T("password")){
CComBSTR pwd;
hr=pPwdElement->get_value(&pwd);
if(SUCCEEDED(hr)){
if(pwd.Length()!=0){
CComBSTR msg;
msg=pwd;
CString str(msg);
return str;
}
else{
return "";
}
pDoc2->Release();
return "";
}

如果你想尝试一下如何在后台记录网页密码,你可以实现一个IE扩展的COM组件,由IE负责自动加载,在组件中你必须实现IOleObjectSite接口,在SetSite方法中得到一个指向IE COM对象的Iunknown的指针,再通过它获得其它接口的指针。在程序中还需要创建一个线程负责对当前的网页所有元素实现轮询解析,判断元素的属性是否是一个编辑框(密码编辑框),然后把用户名和密码记录到一个文件中。
本程序在Windows XP(IE6)环境下利用Visual Studio.net Beta 2调试通过。
 
大家好!能给实现上面我所述功能的Delphi代码吗?谢谢谢谢!
 
一个windows勾子函数就搞定
 
to cg1120:
来一段windows勾子函数解决上面问题
 
已经发送邮件给你了
 
接受答案了.
 
to 陈尚伟
xjue_root@163.com
谢谢!
 
后退
顶部