设置 Cursor.Position “半部分”工作(从一个显示器到另一个显示器)

3

我有两个显示器,非主显示器(编号1)位于主显示器(编号2)的左上角,如下图所示:

enter image description here

我再重复一遍:编号2 是主显示器。

以下是代码:

Cursor.Position = new Point(-500, -500);

当光标最初位于主监视器(编号 2)时,执行代码后,光标将移动到显示器号码1,距其底部500像素,但靠右部分。如下图所示:

输入图像说明

不应该是在这个位置:

输入图像说明

在上述代码运行两次后,会出现以上情况。

Cursor.Position = new Point(-500, -500);
Cursor.Position = new Point(-500, -500);

光标到达了正确的位置。

问题在于,这段代码似乎是一个破解方法,我希望避免使用它,并以“正确”的方式使光标到达正确的位置。

那么我该如何实现呢?


使用SetWindowPos与多个监视器 -- DpiAwareness注意事项。-- 您没有指定应用程序的目标.Net版本和DpiAwareness状态。 - Jimi
@Jimi,.NET6,DPI感知似乎无关紧要(请注意,在第二次执行该行后,光标会到达正确的位置)。此外,两个显示器具有相同的分辨率。 - ispiro
好的,我假设这是PerMonitorV2,在 .Net 6 中默认。请参阅 SetCursorPos 中的注释。 - Jimi
您能否同时发布应用程序在主监视器和次监视器中定位时所报告的VirtualScreen尺寸?使用SetCursorPos会出现问题是很常见的。DpiAwareness的问题在于指针的最终位置是否正确,它看起来并不正常。 - Jimi
如果在任何情况下这些实际上都匹配,尝试改用 SetPhysicalCursorPos,并查看 PhysicalToLogicalPoint 中的注释(仍然与该进程的实际 DpiAwareness 相关的行为)。 - Jimi
显示剩余2条评论
1个回答

2

当您拥有多个屏幕时,您必须小心每个屏幕的边界。C#提供了一个屏幕数组,您可以循环遍历该数组以获取有关屏幕坐标的更多信息,即Screen.AllScreens

enter image description here

请参见下面的图像,它演示仅主屏幕从2D(X,Y)平面的X:0和Y:0开始,我们可以将第二个屏幕调整到任何位置,在我的情况下,它的位置为(-1366,305),如所示。不同的点是 enter image description here 每个屏幕都有其从左到右和从上到下的边界。您可以使用这些边界来到达精确位置,如代码中所示,如果我将其Bounds值添加到Point中,我可以移动到任何屏幕的任何点。

   //To move on First Screen use its Bounds
    Cursor.Position = new Point(300 + Screen.AllScreens[0].Bounds.Left, 300 + Screen.AllScreens[0].Bounds.Top);
    
    //To move on Second Screen use its Bounds
    Cursor.Position = new Point(300 + Screen.AllScreens[1].Bounds.Left, 300 + Screen.AllScreens[1].Bounds.Top);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接