ProblemRootCause: 当Outlook应用程序运行时,无法使SelectNamesDialog显示在GUI上。
我是如何尝试解决的:
我尝试通过打开和关闭Mailitem来触发Outlook事件,然后显示SelectNamesDialog。现在它出现在我们的GUI上。
目前面临的问题:
只有在Outlook应用程序运行时才应在SelectNamesDialog显示之前打开和关闭Mailitem。如果它没有运行,则可以直接显示SelectNamesDialog。
if (msOutlook == true)
{
Microsoft.Office.Interop.Outlook.MailItem oMailItem = (Microsoft.Office.Interop.Outlook.MailItem)app.CreateItem(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem);
oMailItem.Display(false);
oMailItem.Close(Microsoft.Office.Interop.Outlook.OlInspectorClose.olDiscard);
}
bool isDisplayed = SelectNamesDialog .Display();
Microsoft.Office.Interop.Outlook.Recipients recipients = SelectNamesDialog .Recipients;
if (recipients.Count > 0)
{----
}
因此,为了确定Outlook应用程序是否正在运行,我使用Process.GetProcesses()。当进程正在运行时,msOutlook为true。
如果Outlook没有运行并且第一次单击显示按钮,则msOutlook为false并且将执行snd.Display()并且它可以正常工作。但是一旦SelectNamesDialog关闭,Outlook进程就不会结束。 Outlook流程将在一段时间过后才会结束。因此,如果用户第二次立即单击显示按钮,即使Outlook系统中未打开Outlook应用程序,该过程也将“正在运行”,并且msOutlook将为true。
现在下面的行执行将抛出一个COMException
Microsoft.Office.Interop.Outlook.Recipients recipients = SelectNamesDialog .Recipients;
if (recipients.Count > 0)
{----
-----
}
文本:
System.Runtime.Interopservices.COMException
{"The object invoked has disconnected from its clients. (Exception from HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"}
答案 0 :(得分:0)
我能够通过这种方式工作的唯一方法是设置一个计时器并继续检查Process()。HasExited。 GetProcesses无法区分正在关闭自己的进程,也无法区分对用户(或用户界面的开发人员)可能无效的任何状态。您可能会遇到该异常,因为Outlook对象已成功完成部分关闭过程,即断开与其客户端的连接,但尚未完全清理自己并离开。
显然,由于您的GUI可能需要按下按钮,因此您的情况会变得复杂。我建议在HasExited == true之前禁用该按钮。
答案 1 :(得分:0)
你究竟是什么意思"当Outlook应用程序运行时,无法在GUI上显示SelectNamesDialog。"。您的意思是在应用程序后面显示对话框ID吗?
您可以尝试将Outlook带到前台(Application.ActiveWindow.Activate),但之后您需要重新启动应用程序。
或者您可以使用Redemption及其RDOSelectNamesDialog - 因为Redemption在进程中运行而根本不使用Outlook,对话框将是您的应用程序的模态。您还可以显式设置RDOSession.ParentWindow属性,以确保特定窗口是通讯簿对话框的父级。