Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ AccessibleObjectFromPoint()返回不正确的对象_C++_Winapi_Com - Fatal编程技术网

C++ AccessibleObjectFromPoint()返回不正确的对象

C++ AccessibleObjectFromPoint()返回不正确的对象,c++,winapi,com,C++,Winapi,Com,我正在创建一个程序,该程序使用AccessibleObjectFromPoint()通过鼠标光标选择对象,但它会产生错误的结果 以下是我的示例代码: #include <windows.h> #include <oleacc.h> #include <cstdio> #include <iostream> #include <string> #pragma comment(lib, "oleacc.lib") HRESULT Se

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

以下是我的示例代码:

#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;
}
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“oleacc.lib”)
HRESULT SelectItemAtPoint(点-点)
{
变异变异体;
IAccessible*pAcc;
HRESULT hr=可访问对象frompoint(point、pAcc和varItem);
如果((hr==S_正常))
{
hr=pAcc->accSelect((SELFLAG_TAKEFOCUS | SELFLAG_TAKESELECTION),变量);
VariantClear(&varItem);
pAcc->Release();
}
返回人力资源;
}
int main()
{
共初始化(空);
while(true)
{
点pt;
GetCursorPos(&pt);
printf(“x:%d y:%d”,第x部分,第y部分);
选择项目点(pt);
睡眠(50);
}
返回0;
}
在图像中,我在虚幻引擎上悬停,但程序选择了MATLAB。 我还检查了光标点。 有没有办法解决这个问题


编辑:我正在使用Windows 10 Home和Visual Studio 2017,引自Microsoft文档:

Microsoft活动辅助功能不使用逻辑坐标。这个 以下方法和函数返回物理坐标或 把它们作为参数

  • IAccessible::accHitTest
  • IAccessible::accLocation
  • AccessibleObjectFromPoint
默认情况下,一个Microsoft Active Directory 在非96-dpi环境中运行的辅助功能客户端应用程序 将无法从这些调用中获得正确的结果。对于 例如,由于光标位置位于逻辑坐标中,因此 客户端不能简单地将这些坐标传递给
AccessibleObjectFromPoint
以获取 光标

解决方案分为两部分:

  • 使客户端应用程序“dpi感知”。要执行此操作,请致电
    SetProcessDPIAware
    启动时的功能。此函数使整个 进程dpi感知,意味着属于该进程的所有窗口 没有标度

  • 使用支持dpi的功能。例如,获得 光标坐标,调用
    getPhysicalCalcuorSorpos
    函数。不要使用
    GetCursorPos
    ;它在支持dpi的应用程序中的行为尚未定义

如果 您的应用程序执行直接的跨进程通信 不支持dpi的应用程序,可能需要在逻辑和 使用
物理点的物理坐标
逻辑物理点
功能


因此,将
GetCursorPos()
更改为
GetPhysicalCalcuorSorpos()
解决了我的问题。

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