如何對網頁輸入框進行編程
飄飄白云(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 />
因為網頁中輸入框不是一般的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
HRESULT hr = doc->get_activeElement(&pElement);
4
if (SUCCEEDED(hr))
{
5
VARIANT_BOOL vIsTextEdit = VARIANT_FALSE;
6
pElement->get_isTextEdit(&vIsTextEdit);
7
if (vIsTextEdit == VARIANT_TRUE)
{
8
BSTR bTagName;
9
pElement->get_tagName(&bTagName);
10
11
char chTag[MAX_PATH] =
{ '\0' };
12
WideCharToMultiByte(CP_ACP, 0, bTagName, -1, chTag,
13
14
MAX_PATH, NULL, NULL);
15
_strupr_s(chTag, MAX_PATH);
16
if(lstrcmpA(chTag, "INPUT") == 0 || lstrcmpA(chTag,
17
18
"TEXTAREA") == 0)
{
19
VARIANT attr;
20
VariantInit(&attr);
21
22
BSTR bstrTemp;
23
bstrTemp = SysAllocString(L"readonly");
24
hr = pElement->getAttribute(bstrTemp, 0, &attr);
25
if (SUCCEEDED(hr))
{
26
if (attr.vt == VT_BOOL && attr.boolVal ==
27
28
VARIANT_TRUE)
{
29
// read only
30
return false;
31
}
32
33
IHTMLInputTextElement* pInputTextElement;
34
hr = pElement->QueryInterface
35
36
(IID_IHTMLInputTextElement, (void**)(&pInputTextElement));
37
if (SUCCEEDED(hr))
{
38
BSTR bstrType;
39
pInputTextElement->get_type(&bstrType);
40
char chType[MAX_PATH] =
{ '\0' };
41
WideCharToMultiByte(CP_ACP, 0, bstrType, -1,
42
43
chType, MAX_PATH, NULL, NULL);
44
_strupr_s(chType, MAX_PATH);
45
if (lstrcmpA(chType, "PASSWORD") == 0)
{
46
BSTR bstrOld;
47
BSTR bstrNew;
48
bstrNew = SysAllocString(L"Change text");
49
pInputTextElement->get_value(&bstrOld);
50
pInputTextElement->put_value(bstrNew);
51
}
52
}
53
}
54
55
VariantClear(&attr);
56
}
57
}
58
59
pElement->Release();
60
pElement = N
此外你還可以通過調用IHTMLDocument2的調用execCommand函數來控制對網頁的操作,比如復制,剪切等等。(The world瀏覽器的編輯模式查看網頁,我猜就是用這個辦法),下面的是這個ExecCommand函數是對IHTMLDocument2的execCommand函數的簡單封裝。其中cmdStr可以為:L"Paste", L"Cut", L"Copy", L"Undo", L"Delete"等。
1
void ExecCommand(LPCWSTR cmdStr)
2

{
3
if (m_WebDocument == 0 || cmdStr == NULL)
{
4
return;
5
}
6
7
ATL::CComBSTR cmdBStr(cmdStr);
8
ATL::CComVariant vNull;
9
VARIANT_BOOL bOK;
10
HRESULT hRslt = m_WebDocument->execCommand(
11
cmdBStr,
12
VARIANT_FALSE,
13
vNull,
14
&bOK);
15
}