2011-02-25 53 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(); 
     } 
    } 
} 
相關問題