Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IAccessible: метод get_accRole дает разные данные, Неуправляемые дети 
:(
    Опции темы
malor
  Дата 4.5.2012, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Запускаю функцию в MFC-программе - она один результат для переменной насчитала, а этот же кусок, 
помещенный в другое приложение, выставляет иную цифру. Почему?

Внутри исходной программы:
user posted image

Согласно Windows Application UI Development > Accessibility > Windows Automation API > Microsoft Active Accessibility > C/C++ Reference > Active Accessibility User Interface Services > Constants > Object Roles:
14 - ROLE_SYSTEM_APPLICATION
The object represents a main window for an application.


Внутри новой программы:

user posted image

10 - ROLE_SYSTEM_CLIENT
The object represents a window's client area. Microsoft Active Accessibility uses this role 
as a default if there is a question about the role of a UI element.


Код
BOOL EnumAccessible_2(HWND hwnd) 
//=============================================================================
{
    BOOL bRet = FALSE;

    _ASSERTE (::IsWindow(hwnd));

    if (::IsWindow(hwnd))
    {
        IAccessible *pIAccParent = NULL;

        HRESULT hr = AccessibleObjectFromWindow(hwnd, OBJID_WINDOW, IID_IAccessible, (void**)&pIAccParent);

        if (SUCCEEDED(hr) && pIAccParent)
        {
            VARIANT varChild;
            VariantInit(&varChild);
            IAccessible *pIAccChild = NULL;

            //********************************************************

            IEnumVARIANT *pEnum = NULL;
            IAccessible *pCAcc = NULL;

            HRESULT hr = pIAccParent->QueryInterface(IID_IEnumVARIANT, (PVOID*) &pEnum);

            if (pEnum)
                pEnum->Reset();

            long nChildren = 0;
            unsigned long nFetched = 0;

            pIAccParent->get_accChildCount(&nChildren);
            // nChildren равен 4

            VariantClear(&varChild);
            SAFE_RELEASE(pCAcc);

            if (pEnum)
            {
                hr = pEnum->Next(1, &varChild, &nFetched);
                hr = pEnum->Next(1, &varChild, &nFetched);
                hr = pEnum->Next(1, &varChild, &nFetched);
                hr = pEnum->Next(1, &varChild, &nFetched);            // Сразу до 4-го ребенка добираемся
            }

            IDispatch *pDisp = NULL;
            if (varChild.vt == VT_I4)
            {
                hr = pIAccParent->get_accChild(varChild, &pDisp);
            }

            if (pDisp)
            {
                hr = pDisp->QueryInterface(IID_IAccessible, (void**)&pCAcc);
            }

            if (pCAcc)
            {
                VariantInit(&varChild);
                varChild.vt = VT_I4;
                varChild.lVal = CHILDID_SELF;
                pIAccChild = pCAcc;
            }

            UINT nRole = 0;
            
            if (pIAccChild && &varChild)
            {
                VARIANT *pvarChild = &varChild;
                VARIANT varRole;
                VariantInit(&varRole);
                
                // ПЕРЕМЕННАЯ `varRole` ВЫДАЕТ РАЗНЫЕ ЗНАЧЕНИЯ
                HRESULT hr = pIAccChild->get_accRole(varChild, &varRole);
                
                if (SUCCEEDED(hr) && (varRole.vt == VT_I4))
                {
                    nRole = varRole.lVal;
                }
                
                VariantClear(&varRole);
            }    

            //********************************************************

            SAFE_RELEASE(pIAccParent);
            VariantClear(&varChild);
            bRet = TRUE;
        }
    }
    return bRet;
}


Входящий параметр `hwnd` - идентичен в обоих случаях.

Убираю из MFC-программы все конструкции, относящиеся к 'MFC' (как это было см. здесь).

Запускаю. А теперь и исходная программа стала выдавать значение `ROLE_SYSTEM_CLIENT`!
Что за чудеса в решете...

Это сообщение отредактировал(а) malor - 5.5.2012, 17:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




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


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

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