Доступность API сломана в Windows 10 1809 - PullRequest
0 голосов
/ 05 октября 2018

Я использую Accessability API, чтобы получить роль при изменении фокуса во внешних приложениях, например Microsoft Edge, Firefox или Chrome.До октябрьского обновления для Windows работал следующий код.После обновления роль всегда сообщается как ROLE_SYSTEM_CLIENT

Я что-то не так делаю или это ошибка в обновлении?

    HWINEVENTHOOK objectFocusHook = SetWinEventHook(EVENT_OBJECT_FOCUS, EVENT_OBJECT_FOCUS, NULL, &CMonitor::WinEventHookProc, 0, 0, WINEVENT_OUTOFCONTEXT);

затем

void CALLBACK CMonitor::WinEventHookProc(HWINEVENTHOOK hook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD idEventThread, DWORD time)
{
    if (event == EVENT_OBJECT_FOCUS)
    {
        IAccessible* pAcc = nullptr;
        VARIANT varChild;

        if (SUCCEEDED(AccessibleObjectFromEvent(hwnd, idObject, idChild, &pAcc, &varChild)))
        {
            BSTR bstrName;
            VARIANT varRole;
            VARIANT varState;

            pAcc->get_accName(varChild, &bstrName);

            // after October update this always return ROLE_SYSTEM_CLIENT
            if (SUCCEEDED(pAcc->get_accRole(varChild, &varRole)))
            {
                if (varRole.lVal == ROLE_SYSTEM_TEXT)
                {
                    if (SUCCEEDED(pAcc->get_accState(varChild, &varState)))
                    {
                        // we do more with this  
                        bool isProtected = (varState.lVal & STATE_SYSTEM_PROTECTED) != 0;
                    }
                }
            }

            pAcc->Release();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...