Automation 以编程方式在PowerPoint中播放形状的声音

Automation 以编程方式在PowerPoint中播放形状的声音,automation,audio,vsto,powerpoint,Automation,Audio,Vsto,Powerpoint,我正在编写PowerPoint 2007 VSTO插件,我正在处理一个小问题。外接程序使用以下代码将声音添加到当前幻灯片中: var shape = slide.Shapes.AddMediaObject(soundFileLocation, 50, 50, 20, 20); 生成的形状确实有声音,可以通过PowerPoint幻灯片播放。我的问题是,给定一个以这种方式创建的形状的引用,我希望以编程方式播放声音,但我找不到这样做的方法。我试过了 var soundEffect = shape.A

我正在编写PowerPoint 2007 VSTO插件,我正在处理一个小问题。外接程序使用以下代码将声音添加到当前幻灯片中:

var shape = slide.Shapes.AddMediaObject(soundFileLocation, 50, 50, 20, 20);
生成的形状确实有声音,可以通过PowerPoint幻灯片播放。我的问题是,给定一个以这种方式创建的形状的引用,我希望以编程方式播放声音,但我找不到这样做的方法。我试过了

var soundEffect = shape.AnimationSettings.SoundEffect;
soundEffect.Play();
但这会失败/崩溃,当我检查soundEffect时,它的类型是ppSoundNone。
编辑:

var shape = slide.Shapes.AddMediaObject(fileLocation, 50, 50, 20, 20);
shape.AnimationSettings.SoundEffect.ImportFromFile(fileLocation);
这样做可以让我通过以下方式播放声音:

var animationSettings = shape.AnimationSettings;
var soundEffect = shape.AnimationSettings.SoundEffect;
soundEffect.Play();
但有一个大问题,;这仅适用于最后添加的形状。出于某些原因,shape.AnimationSettings.SoundEffect.ImportFromFile(fileLocation)似乎将先前创建的形状的SoundEffect属性重置为ppSoundNone


如果这是不可行的,我会感到惊讶,但我似乎找不到如何做到——任何帮助都将不胜感激

很抱歉使用VBA,但它可以很容易地移植到C#。以下是可行的方法:

Sub addsound1()
    Dim ap As Presentation : Set ap = ActivePresentation
    Dim sl As Slide : Set sl = ap.Slides(1)
    Dim audioShape As Shape
    soundFileLocation = "C:\droid_scan.wav"
    Set audioShape = sl.Shapes.AddShape(msoShapeActionButtonSound, 100, 100, 50, 50)
    With audioShape.ActionSettings(ppMouseClick)
        .Action = ppActionNone
        .SoundEffect.ImportFromFile soundFileLocation
    End With
End Sub
Sub addsound2()
    Dim ap As Presentation : Set ap = ActivePresentation
    Dim sl As Slide : Set sl = ap.Slides(1)
    Dim audioShape As Shape
    soundFileLocation = "C:\droid_scan2.wav"
    Set audioShape = sl.Shapes.AddShape(msoShapeActionButtonSound, 50, 50, 50, 50)
    With audioShape.ActionSettings(ppMouseClick)
        .Action = ppActionNone
        .SoundEffect.ImportFromFile soundFileLocation
    End With
End Sub

Sub PlaySound1()
    Dim sh As Shape
    Set sh = ActivePresentation.Slides(1).Shapes(1)
    sh.ActionSettings(ppMouseClick).SoundEffect.Play
End Sub

Sub PlaySound2()
    Dim sh As Shape
    Set sh = ActivePresentation.Slides(1).Shapes(2)
    sh.ActionSettings(ppMouseClick).SoundEffect.Play
End Sub

感谢您为我指出时间线对象的方向。然而,我仍然停留在如何触发声音在代码中播放的问题上。我的理解是,我需要从某处获取SoundEffect对象,以便调用SoundEffect.Play()。使用此代码后,shape.AnimationSettings.SoundEffect仍然无法为我提供可以播放的内容(),而且我不太明白如何使用时间线来获得可播放的内容。你能提供一些指导吗?Ppt对象对我来说仍然很神秘…@Mathias:除了上面的
PlaySettings
是如何设置的之外,你打算如何播放它?例如,您是否计划进入幻灯片视图,然后在单击字母“P”后播放?或者你想点击一个物体,比如一个形状,然后播放它?还是你想在正常的视野下玩?我正在努力理解你对它的期望,然后我可以更新代码。需要注意的一点是,这不是一个真正的“媒体对象”,然后是一个“动画”第二-这是一个动画第一,所以像“播放”这样的事情并不是你真正期望的。对不起,如果我的场景不清楚。我想做的是从代码中触发播放,而不是通过演示文稿。大致上,我的外接程序维护一组有声音的形状,并显示在列表框中。当用户选择一个项目时,我可以访问该形状,并且我希望播放声音。这不是在幻灯片放映模式下,而是在正常模式下(幻灯片设计)。AddMediaObject创建可单击的形状,在幻灯片放映模式下播放声音。我正在寻找一种方法,以编程方式在“设计”模式下播放形状附带的声音。@Mathias:在普通视图下播放-我不知道有什么方法可以做到这一点。对象模型不支持这个。这是个坏消息。我把它用于叙事,希望在“声音”形状上同样可行。