如何检测用户是否正在访问我已启动的Outlook进程?
我有一个C#应用程序,其中我通过Office PIA访问Outlook以解析约会。在我的应用程序中,当我创建我的Outlook对象时,任务管理器中会创建一个新的Outlook过程。当我关闭我的应用程序时,我也退出了Outlook对象。这会关闭我的任务管理器中的Outlook过程。如何检测用户是否正在访问我已启动的Outlook进程?
我的问题是,当用户也与Outlook交互。特别是,如果用户打开Outlook,当我的程序关闭时,我的程序也会关闭该用户的Outlook程序。在观察任务管理器的同时,尝试手动和使用我的程序来打开Outlook,似乎只有一个Outlook实例可以同时运行,并且用户和我的程序都可以访问同一个实例,所以当我从我的程序关闭前景,我也关闭了用户的程序。
奇怪的是,情况并非如此。如果用户关闭Outlook,当我的程序运行时,他的窗口将消失,但Outlook过程不会关闭,我的程序仍然可以继续。就好像该窗口只是Outlook过程的客户端,尽管没有单独的窗口过程。有没有办法让我看到,如果我的程序是唯一使用Outlook进程的程序,或者打开了任何“用户窗口客户端”,那么我可以避免在关闭前台时关闭它?
我自己找到了解决方案。我发现,前景会追踪有多少探险者打开它。到达零探索者不会导致进程关闭,但它表示没有用户打开任何正常的Outlook窗口,因此可以安全地关闭进程。在我的项目中,我有一个可以访问前景的课程。我的解决办法是,以测试在类的析构函数零点探险(以下代码假定“使用Outlook = Microsoft.Office.Interop.Outlook;”):
~OutlookAccessor()
{
try
{
Outlook.Application app = new Outlook.Application();
if (app.Explorers.Count == 0)
{
((Outlook._Application)app).Quit();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
}
catch (System.Runtime.InteropServices.COMException)
{
; // nevermind, we're only trying to free the Outlook COM object, and the most probable cause for this exception is that office is not installed.
}
}
当然,你必须要小心关闭您使用的所有探险者在你的代码,或解决方案将无法正常工作,例如:
private void AccessOutlook(Outlook.MAPIFolder topfolder)
{
Outlook.Explorer explorer = null;
try
{
explorer = topFolder.GetExplorer();
... // do stuff with the explorer
}
finally
{
if (explorer != null)
{
((Outlook._Explorer)explorer).Close();
}
}
}
不知道C#,但你会创建Outlook对象在那里,说有什么“开始了一个新的面貌与PID XXX “或”附加到现有的前景...“? – 2011-02-25 17:16:50
你有没有考虑过让Outlook打开?总的来说,Outlook的使用行为是人们通常无论如何整天都在运行。 – NotMe 2011-03-15 15:40:14
@马克乙:谢谢,但我没有找到那样的事情。但是,我发现了另一个解决方案,所以没问题。 – Boris 2011-03-15 16:03:22