Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
1st
Сен
Получить текст из открытой вкладки Google Chrome в C++ Builder
Posted by obzor under c/c++
Уже не первую неделю ищу способ получения текста из окна браузера Google Chrome и ему подобных для последующей обработки этих данных. Пересмотрел множество тем на разных форумах, но во всех случаях обсуждение либо заканчивается ничем, либо решение уже давно не работает в современных версиях браузера: ни поиск контролов по классам, ни уж тем более DDE для извлечения текста не дают результатов.
Подскажите, пожалуйста, есть ли какой-то другой способ (желательно на C++) для получения текста с просматриваемой страницы? Или это стало невозможным из соображений безопасности?
P. S. Вариант Ctrl+A, Ctrl+C работает, конечно, но слишком раздражает.
Вот, что получилось:
#include "stdafx.h"
#include <string>
#include <iostream>
#include "windows.h"
#include "oleacc.h"
#include "atlbase.h"
std::wstring GetName(IAccessible *pAcc)
{
CComBSTR bstrName;
if (!pAcc || FAILED(pAcc->get_accName(CComVariant((int)CHILDID_SELF), &bstrName)) || !bstrName.m_str)
return L"";
return bstrName.m_str;
}
HRESULT WalkTreeWithAccessibleChildren(CComPtr<IAccessible> pAcc)
{
long childCount = 0;
long returnCount = 0;
HRESULT hr = pAcc->get_accChildCount(&childCount);
if (childCount == 0)
return S_OK;
CComVariant* pArray = new CComVariant[childCount];
hr = ::AccessibleChildren(pAcc, 0L, childCount, pArray, &returnCount);
if (FAILED(hr))
return hr;
for (int x = 0; x < returnCount; x++)
{
CComVariant vtChild = pArray[x];
if (vtChild.vt != VT_DISPATCH)
continue;
CComPtr<IDispatch> pDisp = vtChild.pdispVal;
CComQIPtr<IAccessible> pAccChild = pDisp;
if (!pAccChild)
continue;
std::wstring name = GetName(pAccChild).data();
CComBSTR bstrValue;
if (SUCCEEDED(pAccChild->get_accValue(CComVariant((int)CHILDID_SELF), &bstrValue)) && bstrValue.m_str)
std::wcout << std::wstring(bstrValue.m_str).c_str() << std::endl;
if (WalkTreeWithAccessibleChildren(pAccChild) == S_FALSE)
return S_FALSE;
}
delete[] pArray;
return S_OK;
}
HWND hWndChrome = NULL;
BOOL CALLBACK FindChromeWindowProc(HWND hwnd, LPARAM lParam)
{
wchar_t className[100];
if (GetClassName(hwnd, className, 100) == 0 || wcscmp(className, L"Chrome_WidgetWin_1") != 0)
return TRUE;
wchar_t title[1000];
if (GetWindowText(hwnd, title, 1000) == 0 || wcslen(title) == 0)
return TRUE;
hWndChrome = hwnd;
return FALSE;
}
int main()
{
::CoInitialize(NULL);
EnumWindows(FindChromeWindowProc, 0);
if (hWndChrome == NULL)
return 0;
CComPtr<IAccessible> pAccMain;
::AccessibleObjectFromWindow(hWndChrome, OBJID_CLIENT, IID_IAccessible, (void**)(&pAccMain));
WalkTreeWithAccessibleChildren(pAccMain);
Sleep(10000);
return 0;
}
На данный момент удалось получить адреса всех ссылок со страницы. Но как переделать код, чтобы выводить именно текст? Пробую добавить:
CComBSTR bstrValue2;
if (SUCCEEDED(pAccChild->get_accName(CComVariant((int)CHILDID_SELF), &bstrValue2)) && bstrValue2.m_str)
std::wcout << std::wstring(bstrValue2.m_str).c_str() << std::endl
или просто
std::wcout << name << std::endl
Но после однократного вывода «Google Chrome» и первой ссылки программа останавливается и перестаёт выводить ссылки со страницы O_o
P. S. Чтобы программа заработала, нужно запустить Google Chrome с ключом —force-renderer-accessibility
Вывод в файл работает отлично:
std::wofstream out("output.txt", std::ios::app);
out << name << std::endl;
out.close();
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)