c++ - 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();
}
}
}
解决方案
推荐阅读
- shell - Oozie Shell 操作输出数据超出其限制 [2048]
- javascript - mongo 和 node.js 中的点后的多个命令
- javascript - 全屏自定义视频播放器,但是当我展开全屏时,控件不会出现
- bin - 如何在 Windows 上连接两个二进制文件
- python-3.x - 以字节模式编写文件并在 Python 中放置行分隔符
- php - 在 Woocommerce 我的帐户地址和帐户详细信息中设置唯一的验证错误通知
- reactjs - 流式中继的createFragmentContainer
- azure - VM 上的 Azure 网站:如何仅允许访问印度的 IP 地址
- apache - Apache Perl CGI 脚本 sso 麻烦和环境变量
- python - Python UnicodeDecodeError - 如何从子进程中正确读取 unicode 字符串?