Pozwól na odpowiedź w innym języku. Są tu trzy podstawowe funkcje do obsługi kontrolek IE i małe demo na końcu.
#include <mshtml.h> // todo: wywalić te 3 to stdafx.h
#include <tchar.h>
#include <oleacc.h>
#pragma comment(lib,"oleacc.lib")
#pragma comment(lib,"uuid.lib")
#pragma comment(lib,"user32.lib")
#pragma comment(lib,"oleaut32.lib")
#pragma comment(lib,"ole32.lib")
// 1. mając uchwyt kontrolki browsera IE, szukamy odpowiedniego okienka child
// HWND FindBrowserControl(HWND hwndParent, int index=0);
// zaczynamy z indeksem zerowym. Jeżeli funkcja zwróci wartość niezerową i okaże
// się, że jednak to nie jest ta kontrolka browsera (bo mamy ich kilka),
// to zwiększamy index i szukamy od nowa.
// hwndParent może wskazywać na okno przeglądarki, lub nawet na pulpit.
struct FBC{int index;HWND hwndBrowser;};
static BOOL CALLBACK FindBrowserControlCB(HWND hwnd,LPARAM lParam)
{
TCHAR classname[32];
if (GetClassName(hwnd, classname, 32)==24 && !_tcscmp(classname, TEXT("Internet Explorer_Server")))
{
if ( !((FBC*)lParam)->index-- )
{
((FBC*)lParam)->hwndBrowser = hwnd;
return FALSE; // zakończ enumerator
}
}
return TRUE; // szukaj dalej
}
HWND FindBrowserControl(HWND hwndParent, int index=0)
{
FBC param = {index,0};
EnumChildWindows(hwndParent, FindBrowserControlCB, (LPARAM)¶m);
return param.hwndBrowser;
}
// Zamieniamy uchwyt okna "Internet Explorer_Server" na IHTMLDocument2*
// IHTMLDocument2 *document;
// if (SUCCEEDED(BrowserHandleToDocument(hwndBrowser, &document)))
// {
// ...
// document->Release(); // gdy document nie jest już potrzebny
HRESULT BrowserHandleToDocument(HWND hwndBrowser, IHTMLDocument2 **ppv)
{
UINT uMsg = RegisterWindowMessage(TEXT("WM_HTML_GETOBJECT"));
LRESULT result = SendMessage(hwndBrowser, uMsg, 0, 0);
return result ? ObjectFromLresult(result, IID_IHTMLDocument2, 0, (void**)ppv) : E_NOINTERFACE;
}
// mając IHTMLDocument2*, można zrobić wszystko z zawartością HTML
// DocumentSetElementText(document, L"login", L"administrator");
// ElementId pobieramy ze źródła strony: <input name="login" ...
HRESULT DocumentSetElementText(IHTMLDocument2 *document, LPCWSTR pszElementId,LPCWSTR text)
{
IHTMLDocument3 *doc3;
HRESULT hr = document->QueryInterface(IID_IHTMLDocument3, (void**)&doc3);
if (SUCCEEDED(hr))
{
IHTMLElement *element = NULL;
// SysAllocString można pominąć jeżeli kontrolka należy do tego procesu
BSTR bstrId = SysAllocString(pszElementId);
hr = doc3->getElementById(bstrId, &element);
SysFreeString(bstrId);
// Uwaga! większość metod mshtml (ponad IDispatch) może zwrócić S_OK i zerowy objekt
if (SUCCEEDED(hr) && !element) hr = E_FAIL;
if (SUCCEEDED(hr))
{
BSTR bstrText = SysAllocString(text);
hr = element->put_innerText(bstrText);
SysFreeString(bstrText);
}
doc3->Release();
}
return hr;
}
// przykładowo - we wszystkich kontrolkach IE wkleimy przykładowy tekst
// do pierwszego pola "szukaj" o typowej nazwie "q" (jaki jest na 4programmers)
extern "C" int main()
{
CoInitialize(0);
int index = 0;
HWND hwndBrowser;
while (hwndBrowser = FindBrowserControl(GetDesktopWindow(), index++))
{
IHTMLDocument2 *document;
if (SUCCEEDED(BrowserHandleToDocument(hwndBrowser, &document)))
{
DocumentSetElementText(document, L"q", L"Moje Szukanie");
document->Release();
}
}
CoUninitialize();
return 0;
}