7

问题是 WPF 窗口只需要一个 system.form.window 所以我不能将 Excel 设置为我的 VSTO 应用程序中的所有者对象,因为 VSTO 插件只将 Excel 的 hwnd 或其活动窗口公开为本机窗口,因为它是通讯。这意味着当 WindowStartUpLoadation 设置为中心所有者时,它不起作用。所以我被迫解决这个问题。

到目前为止,我在阅读此站点后想出的是尝试手动将窗口居中,但即使使用他的简单示例,我的窗口也不会出现居中。

 private static void CenterWpfWindowInExcel(WpfParameterDialog wpfDialog)
    {
        WindowInteropHelper helper = new WindowInteropHelper(wpfDialog);
        helper.Owner = new IntPtr(Globals.ExcelAddin.Application.Hwnd);


        // Manually calculate Top/Left to appear centered
        double nonWpfOwnerLeft = Globals.ExcelAddin.Application.ActiveWindow.Left; // Get non-WPF owner’s Left
        double nonWpfOwnerWidth = Globals.ExcelAddin.Application.ActiveWindow.Width; // Get non-WPF owner’s Width
        double nonWpfOwnerTop = Globals.ExcelAddin.Application.ActiveWindow.Top; // Get non-WPF owner’s Top
        double nonWpfOwnerHeight = Globals.ExcelAddin.Application.ActiveWindow.Height; // Get non-WPF owner’s Height
        wpfDialog.WindowStartupLocation = WindowStartupLocation.Manual;
        wpfDialog.Left = nonWpfOwnerLeft + (nonWpfOwnerWidth - wpfDialog.Width)/2;
        wpfDialog.Top = nonWpfOwnerTop + (nonWpfOwnerHeight - wpfDialog.Height)/2;
    }

有任何想法吗?

4

1 回答 1

6

我能够通过使用获取主 Excel 窗口的 Rect 来解决这个问题user32.dll

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

看来 Globals.ExcelAddin.Application.ActiveWindow 并没有给我我预期的尺寸。我认为它给了我功能区插件的尺寸,而不是 Excel 的主窗口。

于 2013-08-08T21:31:06.790 回答