小编Vic*_*cne的帖子

Windows 下的 Java 多显示器处理 - 缩放显示器的错误?

太长了;博士

在 Windows 10 下,如果我将辅助显示器放在主显示器的右侧,并对辅助显示器应用缩放(例如 150%),则显示坐标(由 Java API 返回)会重叠,而不是让显示边界并排坐着。换句话说,如果我慢慢地将鼠标从主屏幕的左边缘移动到辅助屏幕的右边缘,Java的APIMouseInfo.getPointerInfo().getLocation()会返回从0到1920递增的X位置,然后一旦光标进入第二屏幕,该值就会跳跃返回到 1280,然后再次增加到 2560。因此,对于不同的区域,1280-1920 范围会返回两次。

在帖子的末尾,我添加了一个(更新的)演示,使问题变得显而易见。不要犹豫,尝试一下并报告回来。

长版本:

这篇文章提供了太多的背景信息,但也旨在分享我在搜索该主题时学到的东西。

首先,为什么要麻烦?因为我正在用 Java 构建一个屏幕捕获应用程序,该应用程序需要正确处理多显示器配置,包括应用 Windows 缩放功能的显示器。

使用 Java API ( GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()),只要缩放为 100%,就可以观察到主显示器的左上角位于原点 (0,0),而其他显示器的坐标位于主显示器的“旁边” 。

以下图片是使用帖子末尾的代码制作的。

例如,如果我们有 2 个全高清显示器,则主显示器的左上角位于 (0,0),而...

  • 如果次级位于其右侧同一水平,则其左上角为 (1920,0):

在此输入图像描述

  • 如果次级位于其左侧同一水平,则其左上角为 (-1920,0):

在此输入图像描述

  • 如果次级位于下方,水平对齐,则其左上角为 (0,1080):

在此输入图像描述

  • 如果次级位于上方并水平对齐,则其左上角为 (0,-1080):

在此输入图像描述

  • 如果显示器未对齐,则依此类推:

在此输入图像描述

  • 或使用不同的分辨率:

在此输入图像描述

然而,如果辅助显示器被缩放,事情就会出错:似乎缩放因子不仅应用于其尺寸,还应用于其原点,它越来越接近 (0,0)。

如果次级在左边,那就有意义了。例如,当辅助 1920x1080 缩放为 150% 时,它会使逻辑 1280x720 定位在 (-1280,0):

在此输入图像描述

但如果辅助坐标位于右侧,则原点也会缩放到 (1280,0),越来越接近原点并导致它“重叠”主要坐标:

在此输入图像描述

换句话说,如果鼠标位于 (1800,0) - 请参阅上面的红点 - 我无法知道它实际上是位于第一个显示器的右侧(距右边缘 120 像素)还是左侧第二个的(在左边缘的 520 像素处)。在这种情况下,当将鼠标从主显示器移动到辅助显示器时,鼠标的 X 位置会在到达主显示器的边框时“跳回”。

在屏幕上定位窗口也是如此。如果我将对话框的 X 位置设置为 1800,我无法知道它将在哪里打开。

经过多次浏览后,像这样的 …

java windows awt jna display

7
推荐指数
1
解决办法
1243
查看次数

标签 统计

awt ×1

display ×1

java ×1

jna ×1

windows ×1