显示Outlook 2013主窗口时的事件(未加载屏幕)

时间:2016-04-14 09:37:33

标签: c# email outlook ms-office vsto

我通过分析其子窗口(如herehere)来自定义Outlook UI,我必须在显示Outlook主窗口时立即执行此操作。

我通过调用Process.GetCurrentProcess().MainWindowHandle事件处理程序中的OnStartupComplete来接收Outlook主窗口处理程序。它必须在Outlook 2007和Outlook 2010中正常工作,但2013年首先显示启动屏幕,然后仅显示所有Explorers和Inspectors的主窗口。问题是,在OnStartupComplete事件发生时,这个“启动画面”被显示,所以我没有收到正确的处理程序。 我尝试过一些像以下一样糟糕的黑客:

    1。签署资源管理器`ViewSwitch`事件。
    2。 Ribbon`OnLoad`回调。
    3。 Tab`getVisible`回调。

不幸的是没有任何帮助。它们都在显示“启动画面”时发生,因此MainWindowHandle指向它。

问题是当MainWindowHandle指向Outlook的主窗口时是否有任何方法可以定义触发器?

2 个答案:

答案 0 :(得分:1)

我已经调查了一下,发现主要的Outlook窗口" rctrl_renwnd32"在显示启动画面时创建,但它是不可见的。因此,要获取Outlook主窗口句柄,我使用以下方法

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, IntPtr windowTitle);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out int processId);

    public static IntPtr GetOutlookMainHWnd ()
    {
        int curtProcId = Process.GetCurrentProcess().Id;
        int wndProcId = 0;
        IntPtr olMainHWnd = IntPtr.Zero;
        while (curtProcId != wndProcId) //this is to ensure that we get main window of our own process
        {
            olMainHWnd = NativeMethods.FindWindowEx(IntPtr.Zero, olMainHWnd, "rctrl_renwnd32", IntPtr.Zero);
            GetWindowThreadProcessId(olMainHWnd, out wndProcId);
        }

        return olMainHWnd;
    }

答案 1 :(得分:0)

您只需将ExplorerApplication.ActiveExplorer)或Inspector对象转换为IOleWindow并致电IOleWindow::GetWindow即可。