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

本文关键字:焦点 我的 应用程序 Outlook 窗口 新邮件 | 更新日期: 2023-09-27 17:57:47

我遇到了一个问题,我已经试着解决了好几天了,但运气不好!

在我的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之前激活()
  • 激活MailItem检查器对象
  • 通过自动化激活Outlook的ActiveWindow和ActiveExplorer
  • 在MSDN论坛上使用AutoIt与MS Word的类似问题

任何帮助都将不胜感激!

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

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

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
}

如果你确实掌握了坏窗口的窍门,那就试一试。

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

我还没能用您的代码重现这个问题。我使用过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);
}

互操作通常有一些奇怪的行为s