c#将outlook窗口带到前面

c#将outlook窗口带到前面,c#,outlook,C#,Outlook,我还没有找到解决这个问题的可行办法 我有一个启动outlook compose窗口的外部应用程序,我想确保它总是在前面弹出。并非总是如此。例如,如果我用tab键切换到Outlook,然后返回应用程序并启动任务,它只会在底部闪烁 我尝试了一些关于getinspector.Active()等的建议,但没有任何效果 一些示例代码: String address = "someone@example.com"; Outlook.Application oApp = new Outlook.Applic

我还没有找到解决这个问题的可行办法

我有一个启动outlook compose窗口的外部应用程序,我想确保它总是在前面弹出。并非总是如此。例如,如果我用tab键切换到Outlook,然后返回应用程序并启动任务,它只会在底部闪烁

我尝试了一些关于getinspector.Active()等的建议,但没有任何效果

一些示例代码:

String address = "someone@example.com";

Outlook.Application oApp = new Outlook.Application();
Outlook._MailItem oMailItem = (Outlook._MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem);
oMailItem.To = address

oMailItem.Body = "example";  

oMailItem.Display(true); //true = modal which I need for this task, have tried without also.

一般来说,这是无法做到的。考虑了如果两个应用程序都希望同时成为最高级别的应用程序,会发生什么情况


有关更广泛的讨论,请参阅。

我没有安装outlook,但是如果将outlook窗口最小化,您可以将整个outlook窗口置于最前面:

        [DllImport("user32.dll")]
        private static extern int SetForegroundWindow(IntPtr hWnd);

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
        private const int SW_SHOWNORMAL = 1;
        private const int SW_RESTORE = 9;

        Process proc = Process.GetProcessesByName("spotify").FirstOrDefault();
        if (proc != null)
        {
             ShowWindow(proc.MainWindowHandle, SW_SHOWNORMAL);   // Make the window visible if it was hidden
             ShowWindow(proc.MainWindowHandle, SW_RESTORE);      // Next, restore it if it was minimized
             SetForegroundWindow(proc.MainWindowHandle);         // Finally, activate the window 
        }
SetForegroundWindow:

展示窗口:

从中翻译示例函数是否有特殊问题

如果无法使
IOleWindows
/
AttachThreadInput
/
setForeGroundIndow
工作,则可以使用及其/
激活
方法。以下VB脚本将把Outlook主窗口带到前台:

set App = CreateObject("Outlook.Application")
set sExplorer = CreateObject("Redemption.SafeExplorer")
sExplorer.Item = App.ActiveExplorer
sExplorer.Activate

这是您需要的工作代码。将窗口带到前台缺少的成分实际上是“inspector.Activate()”,您必须在“mailItem.Display”之后调用它


只是想解释一下诺纳斯的答案。这对我有用。在调用电子邮件显示功能之前,首先最大化outlook窗口

    [DllImport("user32.dll")]
    private static extern int SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);   
    private const int SW_SHOWMAXIMIZE = 3; 

    public void Display()
    {
        message = RedemptionLoader.new_SafeMailItem();
        message.Item = mailApp.CreateItem(Outlook.OlItemType.olMailItem);
        Process proc = Process.GetProcessesByName("outlook").FirstOrDefault();
        if (proc != null)
        {
            ShowWindow(proc.MainWindowHandle, SW_SHOWMAXIMIZE);   
            SetForegroundWindow(proc.MainWindowHandle);         
        }

        ((Outlook.MailItem)message.Item).Display(false);    // Show email to user, false = Non-Modal

    }

在显示消息之前,请尝试将某些内容打印到调试窗口:

Set itm = ol.CreateItem(olMailItem)

Set ins = itm.GetInspector

Debug.Print "this makes the window display..."

ins.Activate
ins.WindowState = olNormalWindow
itm.Display

此解决方案在调用omalitem.Display(true)后立即在前台设置Outlook process Main窗口


不优雅,但它可以工作。

我尝试使用Boinst的答案,但它无法在Outlook最小化时将新电子邮件带到前台。这对我来说似乎更为一致:

MailItem mailItem = applicationOutlook.CreateItem(OlItemType.olMailItem);
mailItem.To = strTo;
mailItem.CC = strCC;
mailItem.Subject = strSubject;
mailItem.HTMLBody = strHtmlBody;

Inspector inspector = mailItem.GetInspector;
inspector.Activate();
inspector.WindowState = OlWindowState.olMinimized;
mailItem.Display(false);
inspector.WindowState = OlWindowState.olNormalWindow;

试着更清楚地解释为什么这是问题的答案。
 [DllImport("User32.dll", SetLastError = true)]
 static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);

  oMailItem.Display(true);
  var outlookProcess = Process.GetProcessesByName("OUTLOOK");                  
  IntPtr handle = outlookProcess[0].MainWindowHandle;
  SwitchToThisWindow(handle, true);      
MailItem mailItem = applicationOutlook.CreateItem(OlItemType.olMailItem);
mailItem.To = strTo;
mailItem.CC = strCC;
mailItem.Subject = strSubject;
mailItem.HTMLBody = strHtmlBody;

Inspector inspector = mailItem.GetInspector;
inspector.Activate();
inspector.WindowState = OlWindowState.olMinimized;
mailItem.Display(false);
inspector.WindowState = OlWindowState.olNormalWindow;