如何对网页输入框进行编程

如何对网页输入框进行编程

飘飘白云(kesalin@gmail.com) 2009.04.23


假如网页中有如下两个输入框(多行输入框和单行只读输入框),在程序中该怎样来取得输入框的内容和相关属性,或控制用户操作呢?


<textarea name="text"cols="32" rows="4">Multiline editbox</textarea><br />

<input type="text" name="url" value="Readonly editbox" readonly /><br />


Multiline editbox

因为网页中输入框不是一般的EDIT控件,因此不能取得这些输入框的句柄。要实现这个功能,只能通过WebBrowser控件的有关COM接口了。因此要首先取得WebBrowser接口,这个过程可以参考:

如何从一个 HWND 获取 IHTMLDocument 2接口,大意如下:


This article shows how to get the IHTMLDocument2 interface from a HWND. If Microsoft Active Accessibility (MSAA) is installed, you can send the WM_HTML_GETOBJECT message to the document's window (with the window class "Internet Explorer_Server") and then pass the result from SendMessage to an MSAA function, ObjectFromLresult, to get a fully marshaled IHTMLDocument2 pointer.


本文介绍如何从一个 HWND 获取 IHTMLDocument 2 接口。 如果安装了 Microsoft Active Accessibility (MSAA) ,你可以发送 WM_HTML_GETOBJECT 消息到该文档的窗口 (使用窗口类"Internet Explorer_Server"),然后将结果从 SendMessage传给 MSAA 函数 ObjectFromLresult ,这样就获得IHTMLDocument 2 指针。

假设我们已经取得了IHTMLDocument 2 指针,下面我们用这个IHTMLDocument2指针进行一些操作。下面的代码示范了判断当前焦点窗口是否是输入框,然后取得输入框的相关属性和内容(盗取网页秘码就是这么干的),并且修改其内容。

1 IHTMLDocument2 * doc; // GetWebDocument();
2 IHTMLElement * pElement;
3 HRESULThr = doc -> get_activeElement( & pElement);
4 if (SUCCEEDED(hr)) {
5VARIANT_BOOLvIsTextEdit=VARIANT_FALSE;
6pElement->get_isTextEdit(&vIsTextEdit);
7if(vIsTextEdit==VARIANT_TRUE){
8BSTRbTagName;
9pElement->get_tagName(&bTagName);
10
11charchTag[MAX_PATH]={'/0'};
12WideCharToMultiByte(CP_ACP,0,bTagName,-1,chTag,MAX_PATH,NULL,NULL);
13_strupr_s(chTag,MAX_PATH);
14if(lstrcmpA(chTag,"INPUT")==0||lstrcmpA(chTag,"TEXTAREA")==0){
15VARIANTattr;
16VariantInit(&attr);
17
18BSTRbstrTemp;
19bstrTemp=SysAllocString(L"readonly");
20hr=pElement->getAttribute(bstrTemp,0,&attr);
21if(SUCCEEDED(hr)){
22if(attr.vt==VT_BOOL&&attr.boolVal==VARIANT_TRUE){
23//readonly
24returnfalse;
25}

26
27IHTMLInputTextElement*pInputTextElement;
28hr=pElement->QueryInterface(IID_IHTMLInputTextElement,(void**)(&pInputTextElement));
29if(SUCCEEDED(hr)){
30BSTRbstrType;
31pInputTextElement->get_type(&bstrType);
32charchType[MAX_PATH]={'/0'};
33WideCharToMultiByte(CP_ACP,0,bstrType,-1,chType,MAX_PATH,NULL,NULL);
34_strupr_s(chType,MAX_PATH);
35if(lstrcmpA(chType,"PASSWORD")==0){
36BSTRbstrOld;
37BSTRbstrNew;
38bstrNew=SysAllocString(L"Changetext");
39pInputTextElement->get_value(&bstrOld);
40pInputTextElement->put_value(bstrNew);
41}

42}

43}

44
45VariantClear(&attr);
46}

47}

48
49pElement->Release();
50pElement=NULL;
51}

此外你还可以通过调用IHTMLDocument2的调用execCommand函数来控制对网页的操作,比如复制,剪切等等。(The world浏览器的编辑模式查看网页,我猜就是用这个办法),下面的是这个ExecCommand函数是对IHTMLDocument2的execCommand函数的简单封装。其中cmdStr可以为:L"Paste", L"Cut", L"Copy", L"Undo", L"Delete"等。

1 void ExecCommand(LPCWSTRcmdStr)
2 {
3if(m_WebDocument==0||cmdStr==NULL){
4return;
5}

6
7ATL::CComBSTRcmdBStr(cmdStr);
8ATL::CComVariantvNull;
9VARIANT_BOOLbOK;
10HRESULThRslt=m_WebDocument->execCommand(
11cmdBStr,
12VARIANT_FALSE,
13vNull,
14&bOK);
15}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值