简体   繁体   中英

How to get outlook select name dialog box to focus when opened from wpf application and outlook is running

I am creating a wpf application to send outlook appointment. In this application I am opening outlook select name dialog box to select recipients of the appointment. Following is my code:

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();

My problem is that when I open select name dialog it works fine if outlook is not running. But if outlook is running and I open this dialog on click from my application, it opens in back of my application and on top of outlook window. I need to show it on top of my application even if outlook is running. Any help will be highly appreciated to bring this dialog in front of all. Thanks in advance.

You can try to get the outlook Process and bring his windows forward. There is not .NET hook to do so, you will need to use native Win32 DLL for that.

    [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;
            }
        }

Of course Try/Catch...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM