是否可以通过编程方式设置应用程序的 DPI?

问题描述 投票:0回答:2

是否可以通过编程方式设置应用程序的 DPI,或者只能通过系统首选项设置 DPI?

注意: 我的应用程序的 GUI 以 MFC 和 .NET 形式编码。

更新: 经过一番研究后,我发现没有办法做到这一点,所以我不得不同意这里唯一的答案;这是做不到的。

mfc winapi dpi
2个回答
1
投票

假设您正在谈论 Windows 系统范围的设置,该设置决定物理 DPI 设置之间的比率(取决于物理屏幕 + 分辨率),简单的答案是“您不能”,至少不能WinForms 应用程序中的应用程序级别。

可以做的就是向表单添加缩放代码,请参阅此 StackOverflow 条目。基本上,将

AutoScaleMode
设置为
ScaleMode.Dpi
。请参阅其他条目了解更多信息。


0
投票

是的,有办法,但它并不容易或漂亮。

故事时间:几年前,我遇到了一个挑战,客户需要在他们的系统上运行两个旧应用程序:一个仅适用于“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 感知的应用程序,但由于不需要这样做,所以我从未研究过它。

© www.soinside.com 2019 - 2024. All rights reserved.