Winapi SystemParametersInfo SPI_GETNONCLIENTMETRICS.lfMessageFont如何使缩放一致?

Winapi SystemParametersInfo SPI_GETNONCLIENTMETRICS.lfMessageFont如何使缩放一致?,winapi,scaling,dpi,Winapi,Scaling,Dpi,使用在Win10 1909上运行的PerMonitor DPI Aware和PerMonitorV2 DPI Aware win32应用程序,我发现使用DPI助手进行通用字体缩放时存在问题。将SystemParametersInfo()与SPI\u GETNONCLIENTMETRICS一起使用,将基于应用程序启动时的DPI返回。如果我在150DPI时启动应用程序,lfHeight是-18,如果我在96DPI时启动,lfHeight是-12,但是当从96DPI更改为150DPI时调用WM_DPI

使用在Win10 1909上运行的PerMonitor DPI Aware和PerMonitorV2 DPI Aware win32应用程序,我发现使用DPI助手进行通用字体缩放时存在问题。将
SystemParametersInfo()
SPI\u GETNONCLIENTMETRICS
一起使用,将基于应用程序启动时的DPI返回。如果我在150DPI时启动应用程序,lfHeight是-18,如果我在96DPI时启动,lfHeight是-12,但是当从96DPI更改为150DPI时调用WM_DPICHANGED时,它仍然是-12。这意味着该值取决于应用程序启动时的DPI。这导致了通用缩放的问题,因为如果从150DPI开始移动到200DPI,它将是-36而不是-24。因此,在确定如何缩放由
systemparameters sinfo()返回的字体时,您是否需要保存启动DPI并使用它

蒂娅

如果我在150DPI时启动应用程序,如果我启动,lfHeight为-18 在96DPI时,lfHeight为-12,但在调用WM_DPICHANGED时 从96DPI变为150DPI,仍然是-12

API不支持DPI,如果调用线程支持每监视器DPI,则不应使用API。有关此API的支持DPI的版本,请参阅

systemparameters sinfofordpi
API为我提供了预期的结果您可以这样尝试:

case WM_DPICHANGED:
{
    WORD newDpi = HIWORD(wParam);

    NONCLIENTMETRICS info = { 0 };
    info.cbSize = sizeof(info);

    if (!SystemParametersInfoForDpi(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0, newDpi))
        err = GetLastError();
}

wParam
HIWORD
LOWORD
包含窗口的新dpi的值。参考。看起来没有人读过我写的东西吗?这是特定于SPI_GETNONCLIENTMETRICS数据的。看起来就是这样,我必须在启动时基于DPI为这些字体添加一个新的比例因子。现在我发现Win10中的Window存在问题,当从较高的DPI开始并移动到较小的DPI时,windows在客户端区域周围有一个边框(在单击“输入”和“输出”之前会闪烁几次。我将开始新的问题。@df234987您是否介意分享您使用
systemparameters info
而不是
WM\u DPICHANGED
?这是用于缩放字体作为WM\u DPICHANGED的一部分的原因