3

我有一个问题,我已经尝试解决好几天了,但没有运气!

在我的 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与 MSDN 论坛上的 MS Word 类似的问题

任何帮助,将不胜感激!

4

3 回答 3

3

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

于 2013-02-21T12:01:46.310 回答
3

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

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
}

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

于 2013-02-26T07:58:00.190 回答
1

我无法用您的代码重现问题。我使用了 Microsoft.Office.Interop.Outlook 版本 14.0.0.0,并且在每次测试中我都完成了邮件窗口的焦点。

正如你所说,

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

也许在打开邮件窗口之前尝试集中您的表单和/或让您的应用程序休眠会起作用

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

互操作通常有奇怪的行为。:秒

于 2013-02-21T15:11:51.430 回答