当进程被程序关闭时,如何立即结束Outlook进程?

3
问题根本原因: 当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为真。

如果Outlook没有运行且第一次单击显示按钮,则msOutlook为false,并且snd.Display()将被执行,它可以正常工作。但是,当SelectNamesDialog关闭后,Outlook进程并不会立即结束。只有过了一段时间后,Outlook进程才会结束。因此,如果用户立即第二次单击显示按钮,即使在他的系统中没有打开Outlook应用程序,该进程也将处于“运行”状态,msOutlook将为true。

现在,下面的行的执行将抛出COMException异常

Microsoft.Office.Interop.Outlook.Recipients recipients = SelectNamesDialog .Recipients;

if (recipients.Count > 0)
{----
-----
}

Text:

System.Runtime.Interopservices.COMException
{"The object invoked has disconnected from its clients. (Exception from HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"}

你的问题对我来说似乎很混乱。我的第一反应是你可能需要调用 outlook.Quit(),但很难确定这是否是你的问题。 - Enigmativity
我已经尝试过退出创建的 Outlook 实例并关闭 Outlook 进程。 (app as Microsoft.Office.Interop.Outlook._Application).Quit(); Process.GetProcessesByName("OUTLOOK")[0].Close(); - user3430189
2个回答

2
“无法使SelectNamesDialog在Outlook应用程序运行时显示在GUI之上”,您究竟是什么意思?您是否指对话框在您的应用程序后面显示?
您可以尝试将Outlook置于前台(`Application.ActiveWindow.Activate`),但然后您需要再将您的应用程序带回前台。
或者,您可以使用Redemption(我是其作者)及其RDOSelectNamesDialog - 由于Redemption在不使用Outlook的情况下在进程内运行,因此对话框框将对您的应用程序进行模态。您还可以显式设置RDOSession.ParentWindow属性,以确保特定窗口是地址簿对话框的父窗口。

1
我能够处理这样的事情的唯一方法是设置一个计时器并不断检查Process().HasExited。GetProcesses无法区分正在关闭自身的进程或处于任何可能对用户(或用户界面开发人员)无效的状态。您可能会收到该异常,因为Outlook对象已经成功完成了其关闭过程的一部分,即与其客户端断开连接,但仍未完全清理自己并离开。

显然,您的情况由于具有GUI和可能需要按按钮的用户而变得复杂。我建议在HasExited == true之前禁用该按钮。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接