2

我在这里看到了很多关于这个主题的帖子,但似乎没有一个直接回答这个问题。我想控制在第二台显示器上运行的两个 Powerpoint 实例。

理想的解决方案如下所示:

PowerPoint.Application PPTViewer1 = new PowerPoint.Application();
PowerPoint.Application PPTViewer2 = new PowerPoint.Application();

我可以手动执行此操作,只需启动两个 PowerPoint 实例、加载演示文稿并从每个实例启动幻灯片放映。我可以手动在两个幻灯片放映之间来回切换,每个幻灯片都按预期被带到前面。

那么...如何使用 VSTO 和 C# 以编程方式执行此操作?像我之前的其他人一样,我看到 Interop.PowerPoint 界面将只创建单个实例。如果不是这样,那么我可以很容易地达到我正在寻找的结果。

此外,我不是在为这项任务寻找第三方组件。

任何帮助表示赞赏。

提前致谢。

4

3 回答 3

1

看起来您正在运行多个 Powerpoint 实例,但实际上并非如此。它只允许它自己的一个实例。如果您在任务列表中看到两个 Powerpnt.exe 实例(有时会发生这种情况),这意味着出现问题并在内存中留下了一个僵尸。

于 2012-06-11T23:56:38.033 回答
0

可能并不完全理想,但这里有一个参考建议以不同的用户身份启动实例(请注意,此站点适用于 PowerPoint 2007)。

runas /user:username "C:\Program Files\Microsoft Office\Office12\POWER PNT.EXE"
于 2012-06-08T22:29:22.197 回答
0

Powerpoint COM 对象的每个实例共享同一个全屏显示窗口。我知道没有办法切换哪个演示文稿有那个窗口

解决方案是在您自己的窗口中托管 Powerpoint 显示

因此,这允许您缩放窗口并在一台显示器上显示多个演示文稿,或者将其从一台显示器移动到另一台显示器?

例如

var display1 = new FullScreenDisplay(); // A form with BorderStyle = None
display1.Show();
application1 = new PowerPoint.Application();
presentation1 = application1.Presentations.Open2007(....);
var slideShowSettings1 = presentation1.SlideShowSettings;
slideShowSettings1.ShowType = PowerPoint.PpSlideShowType.ppShowTypeSpeaker;
var slideShowWindow1 = slideShowSettings1.Run();
IntPtr hwnd1 = (IntPtr)slideShowWindow1.HWND;
SetParent(hwnd1, display1.Handle);

var display2 = new FullScreenDisplay();
display2.Show();
application2 = new PowerPoint.Application();
presentation2 = application2.Presentations.Open2007(....);
var slideShowSettings2 = presentation2.SlideShowSettings;
slideShowSettings2.ShowType = PowerPoint.PpSlideShowType.ppShowTypeSpeaker;
var slideShowWindow2 = slideShowSettings2.Run();
IntPtr hwnd2 = (IntPtr)slideShowWindow2.HWND;
SetParent(hwnd2, display2.Handle);

display1.BringToFront(); // to show slideshow 1
// or
display2.BringToFront(); // to show slideshow 2

// To advance a slide
presentation1.SlideShowWindow.View.Next();
// or
presentation2.SlideShowWindow.View.Next();

// To exit, note order!
presentation2.SlideShowWindow.View.Exit();
presentation1.SlideShowWindow.View.Exit();
Application.Exit();

这是一个 hack,可能无法在未来的 Powerpoint 版本中使用?

您还需要此导入

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
于 2012-07-31T09:31:18.143 回答