VSTO 加载项中的 SetProcessDPIAware
SetProcessDPIAware in VSTO add-in
网上有很多关于通过调用 SetProcessDPIAware()
(或通过对应用程序的清单进行一些相关更改)为 Winforms 应用程序设置 DPI 感知的帖子。例如:
How to configure an app to run correctly on a machine with a high DPI setting (e.g. 150%)?
但是,我不确定如何以及在何处调用 VSTO 加载项 中的 SetProcessDPIAware() for Excel 、PowerPoint 等。我对此进行了一段时间的试验,但无法正常工作,因为加载项的各种 Winform 在高 DPI 显示器上仍无法正确缩放。
谁能具体指导如何在 VSTO 加载项中实现 DPI 感知?
您不能在此处影响 DPI 感知,因为这是每个进程的设置,并且您的进程是 Excel 本身(它是 DPI 感知的)。
您只能在程序调用第一个与 DPI 相关的 Windows 函数之前使用 SetProcessDPIAware()
函数,而 Excel 在您的加载项启动之前很久就已经调用了。
但是,不要指望 Winforms 在启用 DPI 感知时能够像魔术一样正确缩放。启用 DPI 感知仅意味着:打开潘多拉盒子,获取 Winforms 提供的所有令人讨厌的高 DPI 效果,让您感到愉悦。您将不得不 fiddle 自己控制距离和尺寸。
微软官方声明:
如果你想要 DPI 意识,不要使用 Winforms,使用 WPF
如果你想要 Touch,不要使用 WPF,使用 UWP...
我们在 Microsoft Word 的化学插件 (Chem4Word) 中解决这个问题的方法是在 WinForms 控件中托管一个 WPF 用户控件
WinForm
+- ElementHost
+- WPF User Control
网上有很多关于通过调用 SetProcessDPIAware()
(或通过对应用程序的清单进行一些相关更改)为 Winforms 应用程序设置 DPI 感知的帖子。例如:
How to configure an app to run correctly on a machine with a high DPI setting (e.g. 150%)?
但是,我不确定如何以及在何处调用 VSTO 加载项 中的 SetProcessDPIAware() for Excel 、PowerPoint 等。我对此进行了一段时间的试验,但无法正常工作,因为加载项的各种 Winform 在高 DPI 显示器上仍无法正确缩放。
谁能具体指导如何在 VSTO 加载项中实现 DPI 感知?
您不能在此处影响 DPI 感知,因为这是每个进程的设置,并且您的进程是 Excel 本身(它是 DPI 感知的)。
您只能在程序调用第一个与 DPI 相关的 Windows 函数之前使用 SetProcessDPIAware()
函数,而 Excel 在您的加载项启动之前很久就已经调用了。
但是,不要指望 Winforms 在启用 DPI 感知时能够像魔术一样正确缩放。启用 DPI 感知仅意味着:打开潘多拉盒子,获取 Winforms 提供的所有令人讨厌的高 DPI 效果,让您感到愉悦。您将不得不 fiddle 自己控制距离和尺寸。
微软官方声明:
如果你想要 DPI 意识,不要使用 Winforms,使用 WPF
如果你想要 Touch,不要使用 WPF,使用 UWP...
我们在 Microsoft Word 的化学插件 (Chem4Word) 中解决这个问题的方法是在 WinForms 控件中托管一个 WPF 用户控件
WinForm
+- ElementHost
+- WPF User Control