【问题标题】:Determine whether Powerpoint is in Presentation mode or not确定 Powerpoint 是否处于演示模式
【发布时间】:2015-01-14 12:44:04
【问题描述】:

我编写了一个程序,当用户可以自己设置的间隔时间过去时,它会弹出并播放声音。

现在我希望它在 Powerpoint 在演示模式下运行并且间隔过去时保持静音,这样程序就不会出现在屏幕顶部并在与外部观众进行演示时播放声音。

使用的 PowerPoint 版本是 07/10/13 (12.0/14.0/15.0) 我找不到任何方法来确定演示模式是否正在运行。

这个程序不是 PowerPoint 插件或类似的东西,只是一个普通的 WPF 桌面应用程序。

【问题讨论】:

  • Powerpoint 版本不是日期。在 MSDN 中有数百个关于 Office 开发的站点和文章,甚至是关于 Office 的整个 DevCenter。检查 Office 互操作,特别是关于 Powerpoint
  • @PanagiotisKanavos 我知道,但它是版本的名称(en.wikipedia.org/wiki/Microsoft_Office#Version_history),所以我需要处理版本 12.0/14.0/15.0 。我不确定互操作,我从未使用过互操作不是控制某些东西的方法吗?因为我不想控制任何东西,我只需要知道演示模式是否正在运行。

标签: c# wpf .net-3.5 powerpoint


【解决方案1】:

对不起,如果回答我自己的问题看起来有点贪婪,但我认为这个答案会帮助有同样问题的人:

只需添加名为“Microsoft PowerPoint 15.0 Object Libary”的 COM 引用 - 它在引用列表中显示为“Microsoft.Office.Interop.PowerPoint”

以下代码测试用于运行演示文稿,并针对 2007/10/13 (12.0/14.0/15.0) 版本进行了测试:

var PPT = new Microsoft.Office.Interop.PowerPoint.Application();

if (PPT.SlideShowWindows.Count > 0)
{ //a PowerPoint Presentation mode is currently running}
else 
{//there is no PowerPoint Presentation mode running}

编辑:

一些错误报告表明,如果 PowerPoint 根本没有运行或演示模式未处于活动状态,则仅以上述方式进行操作可能会导致异常,因此我稍微修改了代码:

private bool IsPPTPresentationRunning()
{
    Process[] prozesse = Process.GetProcesses();
    foreach (Process p in prozesse)
    {//searches for a running PowerPoint process
        if (p.ProcessName == "POWERPNT")
        {
            try
            {
                Microsoft.Office.Interop.PowerPoint.Application PPT = 
                new Microsoft.Office.Interop.PowerPoint.Application();
                if (PPT.SlideShowWindows.Count > 0)
                 return true; 
                else
                 return false; 
            }
            //Catches any exception that seems to get thrown when
            // powerpoint is not in Presentation mode
            catch (Exception) 
            {
                return false;
            }
        }
    }
    return false;
}

【讨论】:

    【解决方案2】:

    这可能会有所帮助...“如何自动化控制 PowerPoint 幻灯片”https://code.msdn.microsoft.com/office/How-to-Automate-control-23cd2a8f

    【讨论】:

    • 首先感谢您,看来我必须使用互操作。但我尝试为我的 3 个 PPT 版本添加 3 个互操作引用,但 Visual Studio 一直告诉我我只能拥有其中一个参考。那么,这可能在 3 个不同版本的 PPT 中实现吗?
    • 只使用 1 个支持最新 PPT 版本的互操作。它也应该有一个向后的支持......
    • 我目前正在尝试,但现在遇到了一个新问题:我能找到的 PowerPoint 15 (PPT 2013) 的唯一参考是 COM 参考(“Microsoft PowerPoint 15.0 对象库”),而不是 .net 参考(最新版本有 14 版(Microsoft.Office.Interop.PowerPoint),我只能在 MSDN 上找到它的 VBA 示例。问题是我什至可以在不使用 VBA 的情况下使用 COM 引用吗?抱歉,如果这个问题听起来很狭隘,但是我是首发..
    • 在 .NET 中使用 com 对象没有问题,只需转到工具箱并添加选定的 com 对象即可。
    • 谢谢,我设法做了一些适用于 15.0 版本的事情,我已将其发送出去以在 12.0 和 14.0 上进行测试。但我目前不确定这三个版本的兼容性。你知道它们是否向后兼容吗?
    【解决方案3】:

    您可以检测是否有任何其他程序(不仅是 PowerPoint)正在全屏运行。 这正是你想要的答案https://stackoverflow.com/a/3744720/1977363

    【讨论】:

    • 全屏是指游戏全屏运行的方式吗?还是它还包括最大化的windows应用程序?
    【解决方案4】:

    访问以下链接。我认为这会有所帮助

    Detect if Full Screen mode is on

    【讨论】:

    • PowerPoint 幻灯片放映通常但并不总是处于全屏模式,因此仅针对该模式进行测试通常但并不总是有效。如果您获得对 PPT 应用程序的引用,它的 SlideShowWindows.Count 属性将告诉您幻灯片视图中的演示文稿数量。如果 >0,则表示正在进行中。
    • @SteveRindsberg 如果您将此作为答案发布(据我目前所知,测试尚未全部完成),这将是我接受此问题的答案。谢谢!
    • @Marv 不用担心;您发布了直接回答问题的代码 sn-p。这样更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多