从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的类似问题
任何帮助都将不胜感激!
我前段时间写过关于聚焦背景窗口的文章:
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