C# 如何将所有者窗口传递给Show()方法重载?

C# 如何将所有者窗口传递给Show()方法重载?,c#,winforms,office-interop,C#,Winforms,Office Interop,我正在处理一个Excel加载项,它在用户单击功能区栏上的按钮后打开winform。此按钮需要是非模态的,以便用户仍然可以与父窗口交互,但它也必须始终位于父窗口的顶部。为了实现这一点,我尝试将父窗口作为参数传递到Show()方法中。这是我的密码: Ribbon1.cs private void button2_Click(object sender, RibbonControlEventArgs e) { RangeSelectForm newForm = new

我正在处理一个Excel加载项,它在用户单击功能区栏上的按钮后打开winform。此按钮需要是非模态的,以便用户仍然可以与父窗口交互,但它也必须始终位于父窗口的顶部。为了实现这一点,我尝试将父窗口作为参数传递到Show()方法中。这是我的密码:

Ribbon1.cs

    private void button2_Click(object sender, RibbonControlEventArgs e)
    {
        RangeSelectForm newForm = new RangeSelectForm();

        newForm.Show(this);
    }
此代码的问题是单词“this”引用的是ribbon类,而不是父窗口。我还尝试传入Globals.ThisAddIn.Application.Windows.Parent。这将导致运行时错误“与'System.Windows.Forms.Form.Show(System.Windows.Forms.IWin32Window)'匹配的最佳重载方法具有一些无效参数”。传递父窗口以显示()的正确方式是什么

如果相关的话,这是一个在.NET 4.0上使用C#编写的Office 2010应用程序

编辑---基于Slaks答案

 using Excel = Microsoft.Office.Interop.Excel;

...

        class ArbitraryWindow : IWin32Window
        {
            public ArbitraryWindow(IntPtr handle) { Handle = handle; }
            public IntPtr Handle { get; private set; }
        }

        private void button2_Click(object sender, RibbonControlEventArgs e)
        {
            RangeSelectForm newForm = new RangeSelectForm();
            Excel.Application instance = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
            newForm.Show(new ArbitraryWindow(instance.Hwnd));
        }

您需要创建一个实现
IWin32Window
并返回Excel的
Application.Hwnd
属性的类

例如:

class ArbitraryWindow : IWin32Window {
    public ArbitraryWindow(IntPtr handle) { Handle = handle; }
    public IntPtr Handle { get; private set; }
}

newForm.Show(new ArbitraryWindow(new IntPtr(Something.Application.Hwnd)));

实际上更准确地说,我试图从功能区中启动的窗口是Telerik Radform。这是一个编译时错误。您应该能够比从addin属性更容易地获取应用程序。您是对的。Globals.ThisAddIn.Application.Hwnd有效。我正在获取“ExcelAddIn2.Globals的未知成员应用程序”我不知道在哪里可以立即找到Excel
应用程序
实例,但您应该从加载项中找到一个。我在Microsoft.Office.Interop.Excel中找到了它。但是在修复了这个问题之后,我现在得到了“未知的构造函数Ribbon1.ArricryWindow(int)of ExcelAddIn2.Ribbon1.ArricryWindow。有关详细信息,请参阅对我的问题的编辑。您需要
新的IntPtr(…)
。@SLaks:很抱歉打扰您。但是您对我的相关问题有任何提示吗()?直到现在还没有人帮助我。。。