我需要打开几个以前填充了ticulo和电子邮件正文的Outlook窗口,以便以后的用户通知发件人。我需要打开几个窗口(我走一个网格知道有多少个窗口)。 我试图用线程执行此操作但发生错误消息说:Outlook无法执行此操作,因为对话框已打开。请关闭它并再试一次“ 如何打开多个竞争窗口?
测试电话
private void button2_Click(object sender, EventArgs e)
{
int qtdEventos = dgvDescEvento.RowCount;
Thread[] Threads = new Thread[qtdEventos];
try
{
cEmail testeEmail = new cEmail();
for (int i = 0; i < qtdEventos; i++)
{
Threads[i] = new Thread(new ThreadStart(new cEmail().Monta));
}
foreach (Thread t in Threads)
{
t.Start();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Outlook = Microsoft.Office.Interop.Outlook;
namespace NavEventos.Class
{
class cEmail
{
private Outlook.Application outlookApp;
public cEmail()
{
outlookApp = new Outlook.Application();
}
public void Monta()
{
string pTitulo = "Title";
string pAssunto = "Body test";
Outlook._MailItem oMailItem = (Outlook._MailItem)outlookApp.CreateItem(Outlook.OlItemType.olMailItem);
Outlook.Inspector oInspector = oMailItem.GetInspector;
Outlook.Recipients oRecips = (Outlook.Recipients)oMailItem.Recipients;
#region MONTA ASSUNTO
oMailItem.Subject = pTitulo;
#endregion
#region MONTA CORPO DO E-MAIL
oMailItem.Body = pAssunto;
#endregion
oMailItem.Display(true);
}
}
}
答案 0 :(得分:0)
你可能不喜欢这个......但你不应该尝试。 ;(
正如您所看到的,Outlook COM界面正在努力阻止您这样做,这是Outlook自动化库的一个限制,即以模式方式显示邮件项目。
这是有充分理由的,您的用户在您的LOB应用程序中,然后您的代码希望他们阅读Outlook中的电子邮件,您已使用COM自动化库进行了Outlook。现在,工具栏中的Outlook图标正在闪烁,因为已打开一个新的电子邮件模式窗口,但此对话框可能已在您当前的LOB应用程序后面打开。
现在,用户需要将上下文切换到Outlook以查看对话框并阅读电子邮件。
如果您可以同时查看是否需要打开这些电子邮件,那么您和outlook com自动化将会很好地相处:)
否则,请考虑为Outlook编写插件并将您的电子邮件管理例程移动到Outlook本身。在那里你可以非常有创意,听起来你真的需要一个主 - 详细的界面风格,比如主Outlook浏览器,所以你有一个这些电子邮件的列表,当用户点击它们时,它们会显示在预览检查器中
也许解决方案是使用您的逻辑将这些消息移动到 Outlook中的特定文件夹,然后使用Outlook自动化来实现此目的 文件夹中的当前活动窗口,然后用户可以决定 他们想要采取行动的电子邮件。