Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить URL из Google Chrome c помощью IAccessibl, Перевод с С++ 
:(
    Опции темы
Zlo
Дата 9.5.2015, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



Нужно вытащить из окна браузера Chrome URL
Есть код на С++ который это делает:
Код

#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();
        if (name.find(L"Адресная строка и строка поиска") != -1)
        {
            CComBSTR bstrValue;
            if (SUCCEEDED(pAccChild->get_accValue(CComVariant((int)CHILDID_SELF), &bstrValue)) && bstrValue.m_str)
                std::wcout << std::wstring(bstrValue.m_str).c_str();

            return S_FALSE;
        }

        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 _tmain(int argc, _TCHAR* argv[])
{
    ::CoInitialize(NULL);
    EnumWindows(FindChromeWindowProc, 0);

    if (hWndChrome == NULL)
        return 0;

    CComPtr<IAccessible> pAccMain;
    HRESULT hr = ::AccessibleObjectFromWindow(hWndChrome, 1, IID_IAccessible, (void**)(&pAccMain)); // 1 - захардкоженный идентификатор ловушки

    CComPtr<IAccessible> pAccMain2;
    ::AccessibleObjectFromWindow(hWndChrome, OBJID_CLIENT, IID_IAccessible, (void**)(&pAccMain2));

    WalkTreeWithAccessibleChildren(pAccMain2);

    return 0;
}


Нужно это перевести в делфи, но чет я запутался и не получается. Остановился в самом начале как быть дальше не понимаю ну в сях не силен совсем:
Код

function TForm1.MyChromeURL(ChromeHWND:HWND):string;
var
  ChildAccessible : IAccessible;
  ChildDispatch : IDispatch;
  AName: WideString;
  AccChild: OleVariant;
  ChildArray : array of OleVariant;
  dwNum : DWord;
  Enum : IEnumVARIANT;
  i, iChildCount, iObtained : Integer;
begin
  AccessibleObjectFromWindow(ChromeHWND, OBJID_CLIENT,IID_IAccessible, ChildAccessible);
  ChildAccessible.Get_accChildCount(iChildCount);
  SetLength(ChildArray, iChildCount);
  AccessibleChildren(Pointer(ChildAccessible), 0, iChildCount, ChildArray[0], iObtained);

  for I := 0 to iObtained - 1 do  begin
    AccChild:=ChildArray[i];

  end;

end;



Описание метода и код можно также глянуть на хабре habrahabr.ru/company/infopulse/blog/253729/
PM MAIL   Вверх
Zlo
Дата 10.5.2015, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



Взял какой-то итальянский исходник попробовал сделать по нему, но все равно запинаюсь на том же месте:

Код

function TForm1.MyChromeURL(ChromeHWND:HWND):string;
var
  vAccObj: IAccessible;
  varChild: OleVariant;
  vWSName, vWSValue: WideString;
  ClassName: String;
  Acesso: HResult;

  iChildCount,iObtained:Integer;
  //AccChild: OleVariant;
  ChildArray : array of OleVariant;
begin
  vAccObj := nil;
  //Acesso := AccessibleObjectFromWindow(hwnd, idObject, idChild, vAccObj,varChild);
  AccessibleObjectFromWindow(ChromeHWND, OBJID_CLIENT,IID_IAccessible, vAccObj);
  SetLength(ClassName, 255);
  vAccObj.Get_accChildCount(iChildCount);
  SetLength(ChildArray, iChildCount);
  Memo1.Lines.Add(IntToStr(iChildCount));
  AccessibleChildren(Pointer(vAccObj), 0, iChildCount, ChildArray[0], iObtained);
  //SetLength(GetClassName(hwnd, pchar(ClassName), 255));

    vAccObj.Get_accName( { CHILDID_SELF } varChild, vWSName);
    vAccObj.Get_accValue( { CHILDID_SELF } varChild, vWSValue);
    Memo1.Lines.Add(vWSName);
    Memo1.Lines.Add(vWSValue);
  IF (pchar(ClassName) = 'Chrome_WidgetWin_1') AND
    (vWSName = 'Адресная строка и строка поиска') THEN
    UrlAtiva := vWSValue;
  IF (UrlAtiva <> UrlVelha) THEN
  BEGIN
    UrlVelha := UrlAtiva;
    Memo1.Lines.Add(UrlAtiva);
  end;
  //vAccObj._Release;
end;

PM MAIL   Вверх
Zlo
  Дата 13.5.2015, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



Ну неужели никто не хочет помочь?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1174 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.