【发布时间】:2017-01-19 13:23:15
【问题描述】:
我正在使用带有AccessibleObjectFromPoint 功能的辅助功能,我希望它能够在每个显示器的 DPI 环境中正常工作。不幸的是,我无法让它工作。我尝试了很多东西,目前的情况是:
- 我的应用在清单中被标记为可感知每个显示器的 DPI。 (
True/PM) - 我使用
GetCursorPos,然后使用AccessibleObjectFromPoint。
如何重现问题:
- 有两台显示器,一台为 100% DPI,另一台为 125%。
- 在 125% 的显示器上运行 Chrome。
- 在其中一个选项卡名称上使用
AccessibleObjectFromPoint,它不起作用。
它适用于某些应用程序(DPI 感知,似乎像资源管理器),但不适用于其他应用程序。我尝试了几个相关的功能,例如GetPhysicalCursorPos和PhysicalToLogicalPointForPerMonitorDPI,但没有任何效果。
值得注意的是,Microsoft 的inspect.exe 按预期工作。
【问题讨论】:
-
操作系统是 8.1、10.0.10240、10.0.10586 还是 10.0.14393。 api不断变化。在 win 7 中,这一切都适用于物理坐标。我有一些在 10586 上工作的代码在 14393 上中断。如果窗口最大化,您可以获得监视器信息,减去监视器原点,然后乘以窗口 dpi 除以监视器 dpi。然后重新添加监视器原点。如果窗口最大化,这适用于 14393。我有同样的问题,仍在调查中。
-
我提到三个版本的 Windows 10 的原因是例如Win32 API 调用 GetDpiForWindow() 仅从 14393 开始可用。我的客户的客户有 10.0.10240 和 10.0.10586 的 LTS 版本,所以这些仍然存在至少好几个月。所以我不得不在 C++/CLI 中编写一个 .NET 包装器,它适用于从 Vista 到 10.0.14393 的所有内容。在运行时动态加载 User32.dll 和 Shcore.dll 并拉入函数指针(或 NULL)以确定您正在执行的操作系统变体,并做出相应的反应。
-
P.S.由于 14393 和线程 DPI 意识,使用清单现在已经过时了。请参阅msdn.microsoft.com/en-us/library/windows/desktop/… 如果在 8.1+ 上调用 SetProcessDpiAwareness,如果在 Win 7 或 Vista 上调用 SetProcessDPIAware()。
标签: windows winapi accessibility uiaccessibility