如何对网页输入框进行编程
飘飘白云(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.
假设我们已经取得了IHTMLDocument 2 指针,下面我们用这个IHTMLDocument2指针进行一些操作。下面的代码示范了判断当前焦点窗口是否是输入框,然后取得输入框的相关属性和内容(盗取网页秘码就是这么干的),并且修改其内容。
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"等。
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}