是否可以通过编程方式设置应用程序的 DPI,或者只能通过系统首选项设置 DPI?
注意: 我的应用程序的 GUI 以 MFC 和 .NET 形式编码。
更新: 经过一番研究后,我发现没有办法做到这一点,所以我不得不同意这里唯一的答案;这是做不到的。
假设您正在谈论 Windows 系统范围的设置,该设置决定物理 DPI 设置之间的比率(取决于物理屏幕 + 分辨率),简单的答案是“您不能”,至少不能WinForms 应用程序中的应用程序级别。
您可以做的就是向表单添加缩放代码,请参阅此 StackOverflow 条目。基本上,将
AutoScaleMode
设置为 ScaleMode.Dpi
。请参阅其他条目了解更多信息。
是的,有办法,但它并不容易或漂亮。
故事时间:几年前,我遇到了一个挑战,客户需要在他们的系统上运行两个旧应用程序:一个仅适用于“100%”Windows DPI 设置,另一个使用非常小的字体, 确实受益于更高的 Windows DPI 设置。
因此,我编写了一个小工具来启动第二个应用程序,并让它相信Windows DPI 设置与实际不同。
我就是这样做的:
获取一个允许您挂钩 Windows 系统调用的库。我用了easyhook。
挂钩 gdi32 GetDeviceCaps 调用。
如果应用程序请求屏幕 DPI,则返回与实际值不同的值。钩子代码看起来像这样:
int WINAPI myGetDeviceCapsHook(HDC hdc, int nIndex)
{
bool isDisplay = (GetDeviceCaps(hdc, TECHNOLOGY) == DT_RASDISPLAY);
if (isDisplay && (nIndex == LOGPIXELSX || nIndex == LOGPIXELSY))
{
return fakeDpiValue; // 96 for 100%, 120 for 125%, ...
}
else
{
return GetDeviceCaps(hdc, nIndex); // pass through to the "real" WinAPI function
}
}
一些图标和 Windows 系统对话框被搞乱了,但除此之外,它的工作效果出人意料地好——至少对于系统 DPI 感知的应用程序(Office 2007-2016 和大多数 .NET 应用程序)来说是这样。遗留应用程序这是用 MS Access 编写的)。
类似的技术可能适用于每个显示器 DPI 感知的应用程序,但由于不需要这样做,所以我从未研究过它。