如何使用System.Runtime.InteropServices.Marshal获取正在运行的PPS的文件名

时间:2014-10-17 18:10:04

标签: c# .net powerpoint office-interop com-interop

我正在尝试创建一个.net 4.0程序,该程序将获取在同一台计算机上查看的PowerPoint Show(PPS)的文件名。目的是计算特定演示文稿在没有任何用户操作的情况下经历多长时间。

我尝试了以下内容:

 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的文件名?

1 个答案:

答案 0 :(得分: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是活动演示文稿的名称,因此如果您只是在查找该信息,则应该这样做(您可能需要清除标题如果您正在运行,例如, Home and Student 版本很少;通常在主窗口标题上有一个非商业用途&#34;标签)