【问题标题】:SetProcessDPIAware in VSTO add-inVSTO 加载项中的 SetProcessDPIAware
【发布时间】:2017-03-08 21:45:36
【问题描述】:

网上有很多关于通过调用SetProcessDPIAware()(或通过对应用程序的清单进行一些相关更改)为 Winforms 应用程序设置 DPI 感知的帖子。例如:

How to configure an app to run correctly on a machine with a high DPI setting (e.g. 150%)?

但是,我不确定在 Excel、PowerPoint 等的 VSTO 插件 中如何以及在何处调用 SetProcessDPIAware()。我已经对此进行了实验虽然,但无法使其正常工作,因为加载项的各种 Winform 在高 DPI 显示器上仍然无法正确缩放。

谁能提供有关如何在 VSTO 加载项中实现 DPI 感知的指导?

【问题讨论】:

    标签: c# .net vb.net winforms vsto


    【解决方案1】:

    您无法在此处影响 DPI 感知,因为这是针对每个进程的设置,并且您的进程是 Excel 本身(可感知 DPI)。 您只能在程序调用第一个与 DPI 相关的 Windows 函数之前使用 SetProcessDPIAware() 函数,而 Excel 早在加载项启动之前就已经这样做了。 但是,不要指望 Winforms 在启用 DPI 感知时能像魔术一样正确缩放。启用 DPI 感知仅意味着:打开潘多拉的盒子,让 Winforms 为您提供所有令人讨厌的高 DPI 效果。您将不得不自己摆弄控制距离和尺寸。 微软官方声明: 如果你想要 DPI 意识,不要使用 Winforms,使用 WPF 如果你想要 Touch,不要使用 WPF,使用 UWP...

    【讨论】:

    • 我的结论是,由于 UHD 和 4K 显示器的使用越来越广泛,Winforms 不应再用于为 Office 开发 VSTO 插件,除非您准备开发一些强烈的 DPI 和重新缩放逻辑并具有缩放非矢量图像的解决方案。我没有发现 Winforms 与 WPF 的比较足以突出这一点,但这应该是 VSTO 开发人员的首要考虑因素。
    【解决方案2】:

    我们在 Microsoft Word 化学插件 (Chem4Word) 中解决此问题的方法是在 WinForms 控件中托管 WPF 用户控件

    WinForm
    +- ElementHost
       +- WPF User Control
    
    

    【讨论】:

    • 对。 UHD 和 4K 显示器有效地扼杀了 Winforms。只有在 Excel 中的自定义任务窗格和无模式对话框需要时,Winforms 才适用于通过 ElementHosts 托管 WPF。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2017-04-20
    • 2014-05-10
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    相关资源
    最近更新 更多