You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VSTO Outlook如何获取Outlook UI字体所使用的缩放比例?

在VSTO中获取Outlook UI缩放比例并调整自定义任务窗格

获取Outlook UI缩放比例

Outlook没有直接提供获取UI缩放比例的API,但可以通过两种间接方式获取:

1. 基于系统DPI计算

Outlook的UI缩放通常与系统DPI设置同步,你可以通过Windows图形API获取当前屏幕的DPI值,计算缩放比例:

using System.Drawing;

// 获取当前屏幕的DPI缩放比例(以96DPI为基准)
float GetScaleFactor()
{
    using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
    {
        return g.DpiX / 96f;
    }
}

如果是多显示器环境,需要获取Outlook主窗口所在屏幕的DPI,可通过Screen.FromHandle定位对应屏幕:

using System.Windows.Forms;
using Microsoft.Office.Interop.Outlook;

float GetOutlookWindowScaleFactor()
{
    IntPtr outlookHwnd = new IntPtr(Application.ActiveWindow().HWND);
    Screen targetScreen = Screen.FromHandle(outlookHwnd);
    using (Graphics g = Graphics.FromHwnd(outlookHwnd))
    {
        return g.DpiX / 96f;
    }
}

2. 通过内置控件尺寸对比

找到Outlook内置控件(如导航栏按钮),对比其实际显示尺寸与96DPI下的默认尺寸,计算缩放比例。需要借助Windows API获取控件尺寸:

using System.Runtime.InteropServices;
using Microsoft.Office.Interop.Outlook;

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

public struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

float GetScaleViaOutlookControl()
{
    IntPtr outlookHwnd = new IntPtr(Application.ActiveWindow().HWND);
    // 需通过FindWindowEx等API定位Outlook内置控件的句柄,此处仅展示逻辑
    IntPtr controlHwnd = FindWindowEx(outlookHwnd, IntPtr.Zero, "控件类名", "控件文本");
    if (controlHwnd != IntPtr.Zero)
    {
        GetWindowRect(controlHwnd, out RECT rect);
        int actualWidth = rect.Right - rect.Left;
        // 假设该控件在96DPI下的默认宽度为40
        return actualWidth / 40f;
    }
    return 1f;
}

调整自定义任务窗格高度

获取缩放比例后,可通过监听系统显示设置变化事件,动态调整任务窗格高度:

监听显示设置变化

在Add-in的Startup方法中注册事件,在显示设置变更时重新计算高度:

using Microsoft.Win32;
using Microsoft.Office.Tools;

private CustomTaskPane _customTaskPane;

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    // 初始化自定义任务窗格
    _customTaskPane = this.CustomTaskPanes.Add(new YourTaskPaneControl(), "自定义任务窗格");
    // 初始设置适配缩放的高度
    _customTaskPane.Height = (int)(300 * GetOutlookWindowScaleFactor());
    _customTaskPane.Visible = true;

    // 注册显示设置变化事件
    SystemEvents.DisplaySettingsChanged += OnDisplaySettingsChanged;
}

private void OnDisplaySettingsChanged(object sender, EventArgs e)
{
    float scaleFactor = GetOutlookWindowScaleFactor();
    // 调整任务窗格高度(300为96DPI下的基准高度)
    _customTaskPane.Height = (int)(300 * scaleFactor);
}

private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
    // 注销事件,避免内存泄漏
    SystemEvents.DisplaySettingsChanged -= OnDisplaySettingsChanged;
}

注意事项

  • 多显示器场景下,务必获取Outlook窗口所在屏幕的DPI,而非主屏幕。
  • 不同Outlook版本(如2016/2019/365)的UI控件结构可能有差异,通过控件尺寸计算缩放时需适配对应版本。

内容的提问来源于stack exchange,提问作者Willy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 10:50:24