以编程方式关闭进程后立即结束Outlook进程?

时间:2014-03-18 06:52:53

标签: c# outlook focus

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))"}

2 个答案:

答案 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属性,以确保特定窗口是通讯簿对话框的父级。