c# - 从 VSTO 插件获取 Outlook 窗口

标签 c# outlook vsto

我有一个 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 传递给它吗?有没有办法从 Control.FromHandle 以外的处理程序获取 Window 对象?

欢迎任何批评。

谢谢

编辑:

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

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,则所有窗口名称匹配。

您需要将资源管理器或检查器窗口转换为 IOleWindow,而不是使用 FindWindow 函数界面并使用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 接口(interface)的实例用于指定 Show 或 ShowDialog 方法的父窗口句柄。

关于c# - 从 VSTO 插件获取 Outlook 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30660653/

相关文章:

C# Excel VSTO - 可以移动数据透视表吗?

c# - 我如何测试 FileSystemWatcher 引发正确的事件?

c# - 写入单元格会在我的 VSTO 加载项中启用 ScreenUpdating

c# - 我的webapi项目还依赖数据访问层吗?

excel - 从全局地址簿中获取电话号码

C# 窗体 : Accessing Outlook with Multiple Mailboxes

outlook - 我可以将自定义图标添加到 "outlook"项目吗?

c# - 替换 Windows Installer 项目中的 DLL

c# - 带有隐式转换运算符的运行时 InvalidCastException

c# - 在编译器生成的表达式树中使用表达式