[英]Set Parent for the dialog box when the same dialog box can be opened from both WPF and WinForm application
[英]How to get outlook select name dialog box to focus when opened from wpf application and outlook is running
我正在創建一個wpf應用程序來發送Outlook約會。 在此應用程序中,我將打開Outlook選擇名稱對話框以選擇約會的收件人。 以下是我的代碼:
Outlook.SelectNamesDialog selectNameDialog =
outlookApp.Session.GetSelectNamesDialog();
selectNameDialog.SetDefaultDisplayMode(
Outlook.OlDefaultSelectNamesDisplayMode.olDefaultMeeting);
foreach (var recipient in recipientsList)
{
if (string.IsNullOrEmpty(recipient))
continue;
Outlook.Recipient confRoom =
selectNameDialog.Recipients.Add(recipient);
// Explicitly specify Recipient.Type.
confRoom.Type = (int)Outlook.OlMeetingRecipientType.olRequired;
}
selectNameDialog.Recipients.ResolveAll();
selectNameDialog.Display();
我的問題是,當我打開選擇名稱對話框時,如果Outlook未運行,則可以正常工作。 但是,如果Outlook正在運行,並且在我的應用程序中單擊時打開了此對話框,則該對話框將在應用程序的后面以及Outlook窗口的頂部打開。 即使Outlook正在運行,我也需要在應用程序頂部顯示它。 非常感謝任何幫助將此對話框置於所有人面前。 提前致謝。
您可以嘗試進行Outlook流程,並將他的窗口向前移。 沒有.NET掛鈎,您需要為此使用本機Win32 DLL。
[Flags()]
private enum SetWindowPosFlags : uint
{
SynchronousWindowPosition = 0x4000,
DeferErase = 0x2000,
DrawFrame = 0x0020,
FrameChanged = 0x0020,
HideWindow = 0x0080,
DoNotActivate = 0x0010,
DoNotCopyBits = 0x0100,
IgnoreMove = 0x0002,
DoNotChangeOwnerZOrder = 0x0200,
DoNotRedraw = 0x0008,
DoNotReposition = 0x0200,
DoNotSendChangingEvent = 0x0400,
IgnoreResize = 0x0001,
IgnoreZOrder = 0x0004,
ShowWindow = 0x0040,
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
static extern bool BringWindowToTop(IntPtr hWnd);
static readonly IntPtr HWND_TOP = new IntPtr(0);
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);
[DllImport("user32.dll")]
static extern IntPtr SetFocus(IntPtr hWnd);
int bring_window_to_front_mode = 1; // Various option here, try them out
Boolean TopMost = false;
System.Diagnostics.Process[] prcs = System.Diagnostics.Process.GetProcessesByName("XBMCLauncher");
foreach (var proc in prcs)
{
Log.LogLine("Main Window Handle {0}", p.MainWindowHandle.ToInt32());
switch (bring_window_to_front_mode)
{
case 1:
if (TopMost)
{
Log.LogLine("SetWindowPos TopMost {0}", p.MainWindowHandle.ToInt32());
SetWindowPos(p.MainWindowHandle, HWND_TOPMOST, 50, 50, 500, 500, SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.IgnoreResize);
}
else
{
Log.LogLine("SetWindowPos {0}", p.MainWindowHandle.ToInt32());
SetWindowPos(p.MainWindowHandle, HWND_TOP, 50, 50, 500, 500, SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.IgnoreResize);
}
break;
case 2:
Log.LogLine("BringWindowToTop {0}", p.MainWindowHandle.ToInt32());
BringWindowToTop(p.MainWindowHandle);
break;
case 3:
Log.LogLine("SetForegroundWindow {0}", p.MainWindowHandle.ToInt32());
SetForegroundWindow(p.MainWindowHandle);
break;
case 4:
Log.LogLine("SetFocus {0}", p.MainWindowHandle.ToInt32());
SetFocus(p.MainWindowHandle);
break;
}
}
當然可以嘗試/抓住...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.