WPFウィンドウをポップアップするOutlookプラグインがあります
WPF のWindow.Owner
プロパティを Outlook に設定する方法はありますか?
私たちを正しい軌道に乗せてくれた @reedcopsey に敬意を表します...
Outlook ハンドルを取得する秘訣は、リフレクションを使用してアクティブ ウィンドウのタイトル ( Caption )FindWindow
を取得し、Win32 API を使用してアクティブ ウィンドウIntPtr
ハンドル (インスペクター、エクスプローラーなど) を取得することです。この MSDN フォーラムの投稿から着想を得ています。アクティブ ウィンドウ ハンドルを取得したらWindowInteropHelper
、所有者関係の管理に活用できます。
ActiveWindow
)Window yourWPFWindow = new Window();
dynamic activeWindow = Globals.ThisAddIn.Application.ActiveWindow();
IntPtr outlookHwnd = new OfficeWin32Window(activeWindow).Handle;
WindowInteropHelper wih = new WindowInteropHelper(yourWPFWindow);
wih.Owner = outlookHwnd;
yourWPFWindow.Show();
///<summary>
/// This class retrieves the IWin32Window from the current active Office window.
/// This could be used to set the parent for Windows Forms and MessageBoxes.
///</summary>
///<example>
/// OfficeWin32Window parentWindow = new OfficeWin32Window (ThisAddIn.OutlookApplication.ActiveWindow ());
/// MessageBox.Show (parentWindow, "This MessageBox doesn't go behind Outlook !!!", "Attention !", MessageBoxButtons.Ok , MessageBoxIcon.Question );
///</example>
public class OfficeWin32Window : IWin32Window
{
///<summary>
/// The <b>FindWindow</b> method finds a window by it's classname and caption.
///</summary>
///<param name="lpClassName">The classname of the window (use Spy++)</param>
///<param name="lpWindowName">The Caption of the window.</param>
///<returns>Returns a valid window handle or 0.</returns>
[DllImport("user32")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
#region IWin32Window Members
///<summary>
/// This holds the window handle for the found Window.
///</summary>
IntPtr _windowHandle = IntPtr.Zero;
///<summary>
/// The <b>Handle</b> of the Outlook WindowObject.
///</summary>
public IntPtr Handle
{
get { return _windowHandle; }
}
#endregion
///<summary>
/// The <b>OfficeWin32Window</b> class could be used to get the parent IWin32Window for Windows.Forms and MessageBoxes.
///</summary>
///<param name="windowObject">The current WindowObject.</param>
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);
}
}
これはWindowInteropHelperを介して行うことができます:
WindowInteropHelper wih = new WindowInteropHelper(yourWindow);
wih.Owner = outlookHwnd;
yourWindow.Show();