我通过分析其子窗口(如here或here)来自定义Outlook UI,我必须在显示Outlook主窗口时立即执行此操作。
我通过调用Process.GetCurrentProcess().MainWindowHandle
事件处理程序中的OnStartupComplete
来接收Outlook主窗口处理程序。它必须在Outlook 2007和Outlook 2010中正常工作,但2013年首先显示启动屏幕,然后仅显示所有Explorers和Inspectors的主窗口。问题是,在OnStartupComplete
事件发生时,这个“启动画面”被显示,所以我没有收到正确的处理程序。
我尝试过一些像以下一样糟糕的黑客:
不幸的是没有任何帮助。它们都在显示“启动画面”时发生,因此MainWindowHandle
指向它。
问题是当MainWindowHandle
指向Outlook的主窗口时是否有任何方法可以定义触发器?
答案 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)
您只需将Explorer
(Application.ActiveExplorer
)或Inspector
对象转换为IOleWindow
并致电IOleWindow::GetWindow
即可。