SystemParameters.SmallIconWidth 在任何 dpi 上返回 16,那么如何检查实际的最佳图标大小?

Posted

技术标签:

【中文标题】SystemParameters.SmallIconWidth 在任何 dpi 上返回 16,那么如何检查实际的最佳图标大小?【英文标题】:SystemParameters.SmallIconWidth returns 16 on any dpi, so how can I check for actual best icon size? 【发布时间】:2021-09-21 22:45:36 【问题描述】:

我认为SystemParameters.SmallIconWidth 会告诉我小图标的最佳尺寸是多少。但是,即使我在 Settings->Display 中将 dpi 更改为 150%,SystemParameters.SmallIconWidth 的值仍然保持不变。

有没有办法检查最佳图标大小?

(为什么我认为它应该由 dpi 更改 - this answer 和 this one 由具有超过 500k 代表的用户更改。)

【问题讨论】:

您确定您的 DPI 更改已在您的应用中生效吗?你重启了吗? @PmDuda 是的。我什至清理了解决方案并重新构建以确保。 【参考方案1】:

即使您在应用程序清单中和/或在运行时声明完全 DPI 感知,某些 Windows 函数也会出于某种原因返回 96 DPI(或系统 DPI)值。你必须 pinvoke 新的 API:

public enum SystemMetric:int  SM_CXSMICON = 49 
[DllImport("user32.dll")]
static extern int GetSystemMetricsForDpi(SystemMetric smIndex, uint dpi);
[DllImport("user32.dll")]
static extern uint GetDpiForWindow(IntPtr hwnd);

HwndSource source = (HwndSource)HwndSource.FromVisual(this);
IntPtr hWnd = source.Handle;
uint dpi = GetDpiForWindow(hWnd);
int width = GetSystemMetricsForDpi(SM_CXSMICON, dpi);

这些功能仅存在于 Windows 10 更新 1607 及更高版本中。如果您需要支持旧版本,您必须自己手动调整不正确的 DPI 值 (x = x * dpi / 96),而不是调用这些函数。

另见:

Developing a Per-Monitor DPI-Aware WPF Application

【讨论】:

以上是关于SystemParameters.SmallIconWidth 在任何 dpi 上返回 16,那么如何检查实际的最佳图标大小?的主要内容,如果未能解决你的问题,请参考以下文章