Magpie icon indicating copy to clipboard operation
Magpie copied to clipboard

更改鼠标指针大小后无法正确绘制光标

Open JeffersonQin opened this issue 2 years ago • 11 comments

如题。

现在的光标速度直接使用了 srcClient 的大小,然而这个大小其实并没有考虑到 DPI 缩放问题(虽然没有仔细读代码),所以会导致在高 DPI 显示下,光标速度变慢的问题,我之后可能会提交一个 pr 来修复这个问题。光标大小同理,见下图。


举个例子,我的显示器的 DPI 为 120 (125%),将 CursorManager 中部分代码修改为如下可以正常工作:

- float scaleX = (destRect.right - destRect.left) / (srcClient.right - srcClient.left);
- float scaleY = (destRect.bottom - destRect.top) / (srcClient.bottom - srcClient.top);
+ float scaleX = (destRect.right - destRect.left) / (srcClient.right - srcClient.left) / 1.25;
+ float scaleY = (destRect.bottom - destRect.top) / (srcClient.bottom - srcClient.top) / 1.25;

光标大小:

D2D1_RECT_F cursorRect = {
	FLOAT(_targetScreenPos.x),
	FLOAT(_targetScreenPos.y),
-	FLOAT(_targetScreenPos.x + _cursorInfo->width),
-	FLOAT(_targetScreenPos.y + _cursorInfo->height)
+	FLOAT(_targetScreenPos.x + _cursorInfo->width * 1.25),
+	FLOAT(_targetScreenPos.y + _cursorInfo->height * 1.25)
};

image

image

JeffersonQin avatar Sep 06 '21 13:09 JeffersonQin

Magpie不检测DPI缩放,因此建议设置窗口的“高DPI缩放替代”,README里提到了这一点。

据我所知光标是不受DPI影响的,它的大小由系统设定。光标的移速也不受DPI影响,Magpie将光标从窗口的相对位置映射到全屏的相对位置,无需考虑DPI缩放。

Blinue avatar Sep 06 '21 13:09 Blinue

@Blinue 我按照您说的试了一下,很遗憾还是有相同的问题。您有一点说得对:光标本身时不受DPI影响的,然而,光标的绘制是受DPI影响的。我这里所说的光标移动速度,是开启了设置选项中的”缩放时调整光标速度“的选项时的光标速度。此时的光标速度您本来是用srcClientdst计算得来的,然而,我这里指出的是,srcClient本身没有考虑DPI缩放,从而导致光标速度的混乱。

您可能会疑惑为什么光标映射不受影响。因为在光标映射部分,计算采用了两次相对值,所以直接offset掉了,故不受影响。

我碰到过多次类似的问题,所以对此还是比较有自信的🤣

类似问题:

  • https://github.com/hanmin0822/MisakaTranslator/issues/138
  • https://github.com/microsoft/terminal/issues/10983

JeffersonQin avatar Sep 06 '21 13:09 JeffersonQin

设置“高DPI缩放替代”之后源窗口大小应该是不受DPI缩放影响的,在我的电脑上获取的源窗口大小始终是正确的(DPI缩放125%)。因为我无法复现,这个问题可能需要你自己解决(或者只是编译自己的版本),寻找可靠的方法获取源窗口大小,目前使用的API是GetClientRect,一般来说它会考虑DPI缩放。

你是目前唯一报告这个问题的人,所以这应该不是一个普遍的问题。

Blinue avatar Sep 06 '21 14:09 Blinue

Runtime我将全面重写,包括FPS的渲染,因此暂时不要在这些地方贡献。

Blinue avatar Sep 06 '21 14:09 Blinue

我记得 GetClientRect 考虑DPI缩放的前提是进程是 DPI Aware 的,所以到底是不是 actual size 我觉得可能还有待讨论。以及如果无法复现的话,尝试短暂地将缩放调整至150%然后观察不同情况下和Magpie情况下的鼠标大小?以及尽可能地将原窗口变小,这样观察到的现象会越明显。麻烦您了,谢谢您的关注

JeffersonQin avatar Sep 06 '21 14:09 JeffersonQin

以及,我按照您的说法试了之后,如果在对应用程序进行了“高DPI缩放替代”后返回的窗体大小会是真是窗体大小的话,我使用了我自己的某个手动对DPI进行适配的WPF项目 (WPF是默认DPI Aware的) 进行尝试,却发现仍然可以正常使用,所以感觉有点矛盾

JeffersonQin avatar Sep 06 '21 14:09 JeffersonQin

我设置了多种DPI缩放都无法复现。这个链接可能对你有用

Blinue avatar Sep 06 '21 15:09 Blinue

好的 谢谢您,我自己到时候自己用自己编译的吧,以及可能的话我会让别人帮忙测试一下,看看这个问题是否普遍。

JeffersonQin avatar Sep 06 '21 15:09 JeffersonQin

破案了。在系统设置界面,鼠标指针大小不是100%时会出现问题,但问题仅出现在鼠标指针为系统指针的情况下,自定义鼠标指针不受影响。(前面在推summer pockets就是好的)但是我也想不出这个问题该怎么解决了,先搁置着吧。

JeffersonQin avatar Dec 23 '21 02:12 JeffersonQin

我已经注意到这个问题了,系统某些时候会放大原生的光标,但 Magpie 绘制的光标仍然是原始大小。我会寻找修复这个 bug 的方法

Blinue avatar Dec 23 '21 02:12 Blinue

关于此问题的讨论 https://github.com/Blinue/Magpie/discussions/254#discussioncomment-2213503

Blinue avatar May 06 '22 06:05 Blinue