【问题标题】:AccessibleObjectFromPoint() returns an incorrect objectAccessibleObjectFromPoint() 返回一个不正确的对象
【发布时间】:2019-08-21 15:25:45
【问题描述】:

我正在创建一个程序,该程序使用 AccessibleObjectFromPoint() 通过鼠标光标选择对象,但是它会产生不正确的结果。

I hovered the mouse at this icon but it selects a different icon instead.

这是我的示例代码:

#include <windows.h>
#include <oleacc.h>
#include <cstdio>
#include <iostream>
#include <string>

#pragma comment(lib, "oleacc.lib")

HRESULT SelectItemAtPoint(POINT point)
{
    VARIANT varItem;
    IAccessible* pAcc;
    HRESULT hr = AccessibleObjectFromPoint(point, &pAcc, &varItem);
    if ((hr == S_OK))
    {
        hr = pAcc->accSelect((SELFLAG_TAKEFOCUS | SELFLAG_TAKESELECTION), varItem);
        VariantClear(&varItem);
        pAcc->Release();
    }
    return hr;
}

int main()
{
    CoInitialize(NULL);
    while (true)
    {
        POINT pt;
        GetCursorPos(&pt);
        printf("x: %d y: %d", pt.x, pt.y);
        SelectItemAtPoint(pt);
        Sleep(50);
    }
    return 0;
}

在图像中,我将鼠标悬停在虚幻引擎上,但程序选择了 MATLAB。 我还检查了光标点。 有什么办法可以解决这个问题?

编辑:我正在使用带有 Visual Studio 2017 的 Windows 10 Home

【问题讨论】:

  • 您可能错过了在调用AccessibleObjectFromPoint()之前将光标坐标转换为屏幕坐标。
  • GetCursorPos() 不是已经在屏幕坐标中了吗?
  • 也许 UnrealEngine 不想打球。或者这可能是因为 DPI 缩放。
  • 在 DPI 缩放中,如何解决?我注意到调用函数时有一个偏移量。
  • @DavidHeffernan 我终于想出了如何解决它。感谢您提供 DPI 缩放提示。

标签: c++ winapi com


【解决方案1】:

引自微软文档:

Source Link

Microsoft Active Accessibility 不使用逻辑坐标。这 以下方法和函数返回物理坐标或 将它们作为参数。

  • IAccessible::accHitTest
  • IAccessible::accLocation
  • AccessibleObjectFromPoint

默认情况下,Microsoft Active 在非 96 dpi 环境中运行的辅助功能客户端应用程序 将无法从这些调用中获得正确的结果。为了 例如,因为光标位置在逻辑坐标中,所以 客户不能简单地将这些坐标传递给 AccessibleObjectFromPoint 获取下面的元素 光标。

解决方案分为两部分:

  • 使客户端应用程序“支持 dpi”。为此,请调用 SetProcessDPIAware 在启动时起作用。该功能使整个 进程 dpi-aware,意味着属于该进程的所有窗口 未缩放。

  • 使用可识别 dpi 的函数。例如,要获得 光标坐标,调用GetPhysicalCursorPos函数。不使用 GetCursorPos;它在 dpi-aware 应用程序中的行为是未定义的。

如果 您的应用程序执行直接跨进程通信 非 dpi 感知应用程序,您可能在逻辑和 使用PhysicalToLogicalPointLogicalToPhysicalPoint 函数。

所以将GetCursorPos() 更改为GetPhysicalCursorPos() 解决了我的问题。

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2016-09-15
    相关资源
    最近更新 更多