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

C# 如何使用System.Runtime.InteropServices.Marshal获取正在运行的PPS的文件名,c#,.net,powerpoint,office-interop,com-interop,C#,.net,Powerpoint,Office Interop,Com Interop,我正在尝试制作一个.NET4.0程序,该程序将获取在同一台计算机上观看的PowerPoint节目(PPS)的文件名。其目的是确定特定演示文稿在没有任何用户操作的情况下完成所需的时间 我尝试了以下方法: oPPTApp = (PowerPoint.Application)System.Runtime.InteropServices.Marshal. GetActiveObject("PowerPoint.Application"); string ppsname = oPPTApp.Acti

我正在尝试制作一个.NET4.0程序,该程序将获取在同一台计算机上观看的PowerPoint节目(PPS)的文件名。其目的是确定特定演示文稿在没有任何用户操作的情况下完成所需的时间

我尝试了以下方法:

 oPPTApp = (PowerPoint.Application)System.Runtime.InteropServices.Marshal.
 GetActiveObject("PowerPoint.Application");
 string ppsname = oPPTApp.ActivePresentation.Name.ToLower();
在查看演示文稿时,程序运行最小化。即使在与PPS交互(滚动幻灯片、单击等)时,我也会从Microsoft.Office.Interop.PowerPoint应用程序中收到以下错误:

Application (unknown member) : Invalid request.  There is no active presentation.
在搜索之后,我尝试添加:

oPPTApp.Visible = Microsoft.Office.Core.MsoTriState.msoTrue;
但是,这启动了一个新的PowerPoint实例,随后出现了相同的错误

我还将在此提到我正在使用Microsoft PowerPoint 14.0对象库和IOleMessageFilter错误处理程序:


ActivePresentation.Name是否不适用于PPS文件?有没有更好的方法来获取打开的PPS的文件名?

为什么不使用普通的旧
系统.诊断.过程

以下代码将为您提供具有给定友好名称的所有进程的活动窗口的名称(进程名称不带扩展名;在您的示例中为“POWERPNT”)

使用系统诊断;
公共静态IEnumerable GetActiveMainWindowsTitle(字符串processName)
{
var ps=Process.getProcessByName(processName);
foreach(以ps表示的var p)
收益率收益率p.main;
}

MS PowerPoint流程的
MainWindowTitle
是活动演示文稿的名称,因此如果您只查找该信息,则应该这样做(如果您正在运行,例如,家庭和学生版本,则可能需要稍微清理标题;主窗口标题上通常有一个“非商业用途”标记)

使用任务管理器的“流程”选项卡。检查有多少powerpnt.exe实例正在运行。不止一个太多了。我100%确定只有一个实例正在运行,而我在没有opptap.Visible行的情况下尝试此操作。添加此行将启动powerpnt.exe的另一个实例,但无论哪种方式都会出现“无活动演示文稿”错误。您为什么不遵循我的建议?修补自动化界面可能会留下运行过程的额外副本,您无法看到这些副本,但会被GetActiveObject()找到。这不是个人的。。。我绝对听从了你的建议,验证了Powerpnt.exe*32的一个实例正在运行,但仍然得到了错误。你知道有更好的方法吗?既然你提到了,COM似乎有点不可靠。
using System.Diagnostics;

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

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