【发布时间】:2017-11-07 22:43:10
【问题描述】:
我的应用程序恰好是使用 Python 编写的,它使用封装了 SDL 的 pygame,但我想这可能是一个与 Windows API 相关的更普遍的问题。
在我的一些 Python 应用程序中,即使在高分辨率下,我也希望在 Windows 10 下进行逐像素控制。例如,我希望能够确保如果我的 Surface Pro 3 具有 2160x1440 的原始分辨率,那么我可以进入具有这些尺寸的全屏模式并呈现完全具有这些尺寸的全屏图像。
这样做的障碍是“DPI 缩放”。默认情况下,在 Windows 的设置 -> 显示下,“更改文本、应用程序和其他项目的大小”的值为“150%(推荐)”,结果我只能看到我的图像的 2/3。我发现了如何解决这种行为...
- 在系统范围内,通过将该滑块向下移动到 100%(但对于大多数其他应用程序来说,这是 undesirable)
- 仅适用于
python.exe和pythonw.exe,通过转到这些可执行文件的“属性”对话框、“兼容性”选项卡,然后单击“在高 DPI 设置下禁用显示缩放”。我可以为我一个人或为所有用户执行此操作。我还可以通过以编程方式在注册表中设置适当的键来自动执行此过程。或通过.exe.manifest文件(这似乎也需要更改全局设置,以偏爱外部清单,可能会对其他应用程序产生副作用)。
我的问题是:在我打开图形窗口之前,我可以在每次启动时从我的程序内部执行此操作吗?我或任何使用我的软件的人都不一定希望为所有 Python 应用程序启用此设置——我们可能只是在运行特定的Python 程序时才需要它。我想可能有一个 winapi 调用(或者在 SDL 中失败,由 pygame 包装)可以实现这一点,但到目前为止我的研究是空白。
【问题讨论】:
-
如果您需要支持 Windows 7,请阅读@IInspectable 链接中提到的向您的 EXE 添加“清单”资源
-
Windows 7 有一个单独的 API 调用,
SetProcessDPIAware()。如果您无法完全控制清单文件,则可能需要这样做(因为每个可执行文件只能有一个)。 -
仅供参考 150% 并不总是默认值,Windows 根据屏幕尺寸和 EDID 数据选择默认值。
-
看看this answer——它在 Windows 10 上对我有用!
标签: winapi graphics windows-10