以程序方式关闭Outlook进程后立即结束该进程

本文关键字:进程 结束 方式关 Outlook 程序 | 更新日期: 2023-09-27 17:50:40

问题根本原因:当Outlook应用程序正在运行时,无法在GUI上显示SelectNamesDialog。

我试图解决的问题:

我尝试通过打开和关闭邮件项目来触发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((将被执行,并且工作正常。但是Outlook进程不会在SelectNamesDialog关闭后立即结束。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))"}

以程序方式关闭Outlook进程后立即结束该进程

你说的"当Outlook应用程序正在运行时,无法在GUI上显示SelectNamesDialog&";。你的意思是显示在你的应用程序后面的对话框id吗?

您可以尝试将Outlook置于前台(Application.ActiveWindow.Activate(,但随后需要将您的应用程序恢复。

或者你可以使用Redemption(我是它的作者(和它的RDOSelectNameDialog——因为Redemption是在进程中运行的,根本不使用Outlook,所以对话框将是你的应用程序的模式。还可以显式设置RDOSession.ParentWindow属性,以确保特定窗口是通讯簿对话框的父窗口。

我处理这类事情的唯一方法是设置一个计时器并不断检查Process((。已退出。GetProcesses无法区分正在关闭的进程,或者处于对用户(或用户界面开发人员(无效的任何状态的进程。您可能会遇到这种异常,因为Outlook对象已经成功完成了部分关闭过程,即与客户端断开连接,但还没有完全清理干净就离开了。

显然,您的情况很复杂,因为您有一个GUI,其中可能有一个用户想要按下按钮。我建议禁用该按钮,直到HasExited==true。