从C#打开的Outlook新邮件窗口似乎有焦点但我的应用程序仍然有它

时间:2013-02-05 10:37:17

标签: c# outlook office-interop office-automation

我遇到了一个问题,我一直试图解决好几天,但没有运气!

在我的Windows窗体应用程序上,我有一个网格。一列包含电子邮件地址。当用户双击此列时,我想通过Outlook自动化打开一个新的电子邮件窗口。该窗口应具有焦点并允许用户立即键入。

在以下情况下一切正常:

  • 我正在从Visual Studio运行我的应用程序。
  • 或者我的应用程序有焦点。

但是,当我运行我的.exe 时,当我双击该列时,Outlook会有焦点,会发生以下情况:

  • 新邮件窗口按预期打开
  • 光标在新邮件窗口中闪烁(正如预期的那样)
  • 当用户开始输入时,光标仍然在Outlook 中闪烁,但键入的文本显示在我的应用程序的网格中,而不是在Outlook中。

我能够通过一个包含文本框的简单表单重现问题。

我使用以下代码:

private void textBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
 OpenOutlookMail(textBox1.Text);
}

private void OpenOutlookMail(string to)
{
  MailItem item = OutlookApp.CreateItem(OlItemType.olMailItem) as MailItem;
  item.To = to;
  item.Subject = string.Empty;
  item.Body = string.Empty;

  item.Display();
}

protected Application OutlookApp
{
    get
    {
        if (mOutlookApp == null)
        {
            mOutlookApp = new Application();

        }
        return mOutlookApp;
     }
  }

我已经尝试过的是

  • 在调用OpenOutlookMail之前通过this.Activate()激活我当前的表单
  • 激活MailItem检查器对象
  • 通过自动化激活Outlook的ActiveWindow和ActiveExplorer
  • 使用AutoIt,如此处所述Similar Problem with MS Word on the MSDN Forum

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:3)

您可以尝试在textBox1_MouseDoubleClick(...)方法中使用具有一些低优先级的Dispatcher.BeginInvoke(...)来调用OpenOutlookMail()。这通常有助于解决像这样的焦点管理问题。

答案 1 :(得分:2)

我写了一篇关于前一段时间聚焦背景窗口的文章:

http://blog.sebastianbrand.com/2010/02/activate-form-in-background.html

private void label1_Click(object sender, EventArgs e)
{
  // mainform.BringToFront(); // doesn't work
  BeginInvoke(new VoidHandler(OtherFormToFront));
}

delegate void VoidHandler();

private void OtherFormToFront()
{
  mainform.BringToFront(); // works
}

如果您确实有坏窗口的句柄,请尝试一下。

答案 2 :(得分:1)

我无法使用您的代码重现问题。我已经使用了Microsoft.Office.Interop.Outlook版本14.0.0.0,并且在我完成的每个测试中,邮件窗口都得到了关注。

正如你所说,

  

在以下情况下,一切正常:    •我正在从Visual Studio运行我的应用程序。    •或者我的应用具有焦点。

在打开邮件窗口之前尝试关注表单和/或让应用程序休眠可能会有效

private void textBox1_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.Focus();
    System.Threading.Thread.Sleep(500);
    OpenOutlookMail(textBox1.Text);
}

Interops经常有奇怪的行为。 :■

相关问题