首页 > 解决方案 > Windows 10 1809 中的可访问性 API 中断

问题描述

当外部应用程序(例如 Microsoft Edge、Firefox 或 Chrome)中的焦点发生变化时,我正在使用 Accessability API 来获取角色。在 10 月更新到 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();
        }
    }
}

标签: c++winapi

解决方案


推荐阅读