2011-02-25 24 views
0

我有一个C#应用程序,其中我通过Office PIA访问Outlook以解析约会。在我的应用程序中,当我创建我的Outlook对象时,任务管理器中会创建一个新的Outlook过程。当我关闭我的应用程序时,我也退出了Outlook对象。这会关闭我的任务管理器中的Outlook过程。如何检测用户是否正在访问我已启动的Outlook进程?

我的问题是,当用户也与Outlook交互。特别是,如果用户打开Outlook,当我的程序关闭时,我的程序也会关闭该用户的Outlook程序。在观察任务管理器的同时,尝试手动和使用我的程序来打开Outlook,似乎只有一个Outlook实例可以同时运行,并且用户和我的程序都可以访问同一个实例,所以当我从我的程序关闭前景,我也关闭了用户的程序。

奇怪的是,情况并非如此。如果用户关闭Outlook,当我的程序运行时,他的窗口将消失,但Outlook过程不会关闭,我的程序仍然可以继续。就好像该窗口只是Outlook过程的客户端,尽管没有单独的窗口过程。有没有办法让我看到,如果我的程序是唯一使用Outlook进程的程序,或者打开了任何“用户窗口客户端”,那么我可以避免在关闭前台时关闭它?

+1

不知道C#,但你会创建Outlook对象在那里,说有什么“开始了一个新的面貌与PID XXX “或”附加到现有的前景...“? – 2011-02-25 17:16:50

+1

你有没有考虑过让Outlook打开?总的来说,Outlook的使用行为是人们通常无论如何整天都在运行。 – NotMe 2011-03-15 15:40:14

+0

@马克乙:谢谢,但我没有找到那样的事情。但是,我发现了另一个解决方案,所以没问题。 – Boris 2011-03-15 16:03:22

回答

2

我自己找到了解决方案。我发现,前景会追踪有多少探险者打开它。到达零探索者不会导致进程关闭,但它表示没有用户打开任何正常的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(); 
     } 
    } 
} 
相关问题