Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

对HiDPI支持有问题 #138

Closed
JeffersonQin opened this issue Aug 14, 2021 · 14 comments
Closed

对HiDPI支持有问题 #138

JeffersonQin opened this issue Aug 14, 2021 · 14 comments
Assignees
Labels
bug Something isn't working fixed

Comments

@JeffersonQin
Copy link

关于哪一项功能

屏幕OCR相关

问题描述

如果系统DPI缩放不是100%,则会出现该问题

应用版本

2.7

系统信息

Windows10 x64

错误信息

附加截图

image

绿色阴影是黑框,即不正常的表现。

解决方案:

可以参考我的个人项目Ayase

我推断是使用P/Invoke调用Win32API时忘记考虑DPI缩放问题了。

我的解决方案:

@JeffersonQin JeffersonQin added the bug Something isn't working label Aug 14, 2021
@JeffersonQin
Copy link
Author

#9 #113

@imba-tjd
Copy link
Collaborator

有限时间内我没法改。我个人不用ocr,我看过一些高dpi的文章但还是不会。
如果有机会,我倾向于用Handy Contro提供的截图功能,因为它已经是本项目的依赖了(虽然理论上截图库不应依赖UI库):https://handyorg.github.io/handycontrol/extend_controls/screenshot/

@JeffersonQin
Copy link
Author

其实是这样的,截图您拿到的画面是对的,但是展示截图的窗口有dpi问题,所以才会出现黑边。

@JeffersonQin
Copy link
Author

因为我之前的那个项目刚遇到这个问题,所以应该是这个问题。

@imba-tjd
Copy link
Collaborator

我不是Owner啊:joy:,我是Collaborator,那些代码不是我写的。我一直用hook,如果以后我要用到ocr了也许会研究吧,我只代表我自己现在不会改。

@JeffersonQin
Copy link
Author

🤣好的好的(我也不太了解情况

@unlsycn
Copy link
Collaborator

unlsycn commented Aug 18, 2021

稍微测试了一下,确实有点问题。
因为我之前修过这个功能,全屏截取应该是没问题的,获取Handle和获取窗口图像也都正常,所以猜测还是窗口定位出了问题。
*好像是之前修复的时候遗漏了这段代码
遗憾的是目前也没时间继续修复了,阁下可以暂时先用全屏截取。

@luojunyuan
Copy link
Contributor

luojunyuan commented Aug 18, 2021

@unlsycn
Copy link
Collaborator

unlsycn commented Aug 18, 2021

说不定开启dpi aware可以简单地解决
https://docs.microsoft.com/en-us/dotnet/desktop/winforms/high-dpi-support-in-windows-forms?view=netframeworkdesktop-4.8

这个是针对WinForms的,而且我们是直接调Win32 API实现的截图,并不是窗口本身显示有问题。

@imba-tjd
Copy link
Collaborator

imba-tjd commented Aug 19, 2021

WPF默认是System级别的DPI Aware,只要运行程序后所在屏幕没有改变DPI,就是DPI Aware的,但好像只适用于WPF自己,程序员创建的字体和图片什么的要写代码处理。
更高级的Per Monitor和Per Monitor V2用于多屏幕,而且也不是开启后就自动支持了,要自己写回调事件代码。

@JeffersonQin
Copy link
Author

@HumphreyDotSln @imba-tjd 确实 您说的是对的 其实只要在创建窗口时手动计算一下大小就行 辛苦了

@jsc723
Copy link
Collaborator

jsc723 commented Oct 13, 2021

我也有这个问题(我的DPI是125%),尤其是插上第二个显示屏的时候,全屏截图的ScreenCaptureWindow会明显超出我显示屏的大小,而且窗口截图也一直不准确。

我之前写过一个解决方案,就直接把ScreenCaptureWindow全屏显示,让系统自己去计算窗口大小,然后我计算Max(图片高度/窗口高度,图片宽度/窗口宽度)得到图片与窗口之间的比值,最后用这个比值把窗口上画的框缩放就好了。我建一个Pull Request,大佬有空的话能看一下是否可行吗

@JeffersonQin
Copy link
Author

@jsc723 我感觉不用这么麻烦 直接用p/invoke可以读到当前屏幕的dpi。我看到代码库里这方面的代码有写,只是在处理的时候忘记掉用了。

@jsc723
Copy link
Collaborator

jsc723 commented Oct 14, 2021

@JeffersonQin @HumphreyDotSln 我懂了,只要把

scw.Width = img.PixelWidth;
scw.Height = img.PixelHeight;

改成

scw.Width = img.Width;
scw.Height = img.Height;

就好了。因为Width和Height单位是device-independent unit(Width等于PixelWidth*96/DPI),已经考虑的DPI的影响,所以也不需要再调用p/invoke获取DPI了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working fixed
Projects
None yet
Development

No branches or pull requests

5 participants