我有一个Outlook 2013 VSTO加载项。我想居中创建的saveFileDialog。为此,您需要向其传递父对象的Window对象。我不确定IWin32WindowWindow是否相同,但这就是我所拥有的。

public IWin32Window getWindowHandle()
{
    dynamic activeWindow = Globals.ThisAddIn.Application.ActiveWindow();
    IntPtr outlookHwnd = new OfficeWin32Window(activeWindow).Handle;
    IWin32Window win = Control.FromHandle(outlookHwnd);

    return win;
}


SaveFileDialog.ShowDialog(Window)方法带有一个窗口。我可以通过IWin32Window吗?除了Window之外,是否有其他方法可以从处理程序中获取Control.FromHandle对象?

任何批评都将受到欢迎。

谢谢

编辑:

哦,还有那个函数的帮助类:

public class OfficeWin32Window : IWin32Window
{
   [DllImport("user32")]
   public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

   IntPtr _windowHandle = IntPtr.Zero;

   public IntPtr Handle
   {
      get { return _windowHandle; }
   }

   public OfficeWin32Window(object windowObject)
   {
      string caption = windowObject.GetType().InvokeMember("Caption", System.Reflection.BindingFlags.GetProperty, null, windowObject, null).ToString();

   // try to get the HWND ptr from the windowObject / could be an Inspector window or an explorer window
   _windowHandle = FindWindow("rctrl_renwnd32\0", caption);
   }


}

给出了这段代码,所以我对此有一个疑问:FindWindow("rctrl_renwnd32\0", caption)做什么?我一点都不明白。特别是“ rctrl_renwnd32 \ 0”部分。

编辑:

IOleWindow类的新功能:

    public IOleWindow getWindowHandle()
    {
        dynamic activeWindow = Globals.ThisAddIn.Application.ActiveWindow();
        IOleWindow win = activeWindow as IOleWindow;
        window = win.GetWindow();
        //IntPtr outlookHwnd = new OfficeWin32Window(activeWindow).Handle;
        //IWin32Window wind = Control.FromHandle(outlookHwnd);

        return window;
    }


编辑2:

更新后的逻辑,我删除了该函数,并将其添加到需要的位置:

Inspector currentObject = Globals.ThisAddIn.Application.ActiveInspector();
var winh = currentObject as IOleWindow;
IntPtr win = winh.GetWindow();


编辑3:

重组:

Inspector currentObject = Globals.ThisAddIn.Application.ActiveInspector();
var winh = currentObject as IOleWindow;
IntPtr win;
winh.GetWindow(out win);

最佳答案

FindWindow方法检索顶级窗口的句柄,该窗口的类名和窗口名与指定的字符串匹配。第一个参数指定窗口类名称。第二个参数是窗口名称(窗口标题)。如果此参数为NULL,则所有窗口名称均匹配。

无需使用FindWindow函数,您需要将资源管理器或Inspector窗口强制转换为IOleWindow界面,并使用GetWindow方法来获取窗口句柄。

 /// <summary>
 /// Implemented and used by containers and objects to obtain window handles
 /// and manage context-sensitive help.
 /// </summary>
 /// <remarks>
 /// The IOleWindow interface provides methods that allow an application to obtain
 /// the handle to the various windows that participate in in-place activation,
 /// and also to enter and exit context-sensitive help mode.
 /// </remarks>
 [ComImport]
 [Guid("00000114-0000-0000-C000-000000000046")]
 [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
 public interface IOleWindow
 {
     /// <summary>
     /// Returns the window handle to one of the windows participating in in-place activation
     /// (frame, document, parent, or in-place object window).
     /// </summary>
     /// <param name="phwnd">Pointer to where to return the window handle.</param>
     void GetWindow (out IntPtr phwnd) ;

     /// <summary>
     /// Determines whether context-sensitive help mode should be entered during an
     /// in-place activation session.
     /// </summary>
     /// <param name="fEnterMode"><c>true</c> if help mode should be entered;
     /// <c>false</c> if it should be exited.</param>
     void ContextSensitiveHelp ([In, MarshalAs(UnmanagedType.Bool)] bool fEnterMode) ;
 }


IWin32Window接口的实例用于为Show或ShowDialog方法指定父窗口句柄。

10-05 21:07
查看更多