我遇到了一个问题,我一直试图解决好几天,但没有运气!
在我的Windows窗体应用程序上,我有一个网格。一列包含电子邮件地址。当用户双击此列时,我想通过Outlook自动化打开一个新的电子邮件窗口。该窗口应具有焦点并允许用户立即键入。
在以下情况下一切正常:
但是,当我运行我的.exe 和时,当我双击该列时,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;
}
}
我已经尝试过的是
任何帮助将不胜感激!
答案 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经常有奇怪的行为。 :■