2

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.

4

1 回答 1

1

您可以尝试获取前景进程并将他的窗口向前推进。没有 .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;
            }
        }

当然尝试/抓住...

于 2012-12-24T13:05:30.633 回答