2014-10-17 37 views
1

我試圖做一個.NET 4.0程序,它會得到一個PowerPoint放映(PPS)的文件名上正在同觀看運行PPS的文件名機。目的是爲了在沒有任何用戶操作的情況下,特定演示需要花費多長時間才能完成。如何獲得使用System.Runtime.InteropServices.Marshal

我已嘗試以下步驟:在演示文稿正在查看

oPPTApp = (PowerPoint.Application)System.Runtime.InteropServices.Marshal. 
GetActiveObject("PowerPoint.Application"); 
string ppsname = oPPTApp.ActivePresentation.Name.ToLower(); 

程序運行最小化。即使在與PPS(通過幻燈片滾動,點擊等)進行交互,我從Microsoft.Office.Interop.PowerPoint._Application以下錯誤:

Application (unknown member) : Invalid request. There is no active presentation. 

通過http://support.microsoft.com/kb/285472搜索後,我嘗試添加:

oPPTApp.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; 

然而,這開始的PowerPoint的新實例,然後同樣的錯誤。

我也將提到我用從這裏的Microsoft PowerPoint 14.0對象庫和IOleMessageFilter錯誤處理程序:http://msdn.microsoft.com/en-us/library/vstudio/ms228772(v=vs.110).aspx

不ActivePresentation.Name不適用於PPS文件?有沒有更好的方法來獲取開放式PPS的文件名?

+0

使用任務管理器,進程選項卡。檢查powerpnt.exe運行的實例數量。不止一個是太多。 – 2014-10-17 18:22:02

+0

我100%確定只有1個實例正在運行,而我沒有使用oPPTApp.Visible行來嘗試。添加此行將啓動powerpnt.exe的另一個實例,但無論哪種方式都會出現「無活動表示」錯誤。 – Alex 2014-10-17 18:25:14

+0

爲什麼你不遵循我的建議?修改自動化界面可能會留下額外的運行副本,您無法看到,但會被GetActiveObject()發現。 – 2014-10-17 18:28:25

回答

1

爲什麼不使用普通老System.Diagnostics.Process

下面的代碼會給你一個給定的友好名稱的所有進程的活動窗口的名稱(不帶擴展進程名稱;你的情況"POWERPNT")。

using System.Diagnostics; 

public static IEnumerable<string> GetActiveMainWindowsTitle(string processName) 
{ 
    var ps = Process.GetProcessesByName(processName); 

    foreach (var p in ps) 
     yield return p.MainWindowTitle; 
} 

一個MS PowerPoint演示過程的MainWindowTitle是當前演示文稿的名稱,所以如果你只是在尋找這些信息,這應該做的(你可能會,如果你正在運行需要清理標題有點,例如,家庭和學生版本;通常在主窗口標題上有「非商業用途」標籤)

+0

更好的解決方案,謝謝。 – Alex 2014-10-20 15:43:26