1

我有:

1 表格 1 面板

我这样做没有问题:运行 notepad.exe 并让它在面板内运行,没有问题。但是,运行 2003 或 2007 查看器时,我可以启动它但不在表单内。(下面的示例代码)

 //DLL Import
    using System.Runtime.InteropServices;

    [DllImport("user32.dll")]
    static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);


  string ppviewer = @"C:\Program Files\Microsoft Office\Office12\PPTVIEW.EXE";

        System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo(ppviewer);
        startinfo.Arguments = @"D:\Test.pps /s";

        System.Diagnostics.Process pptprocess = System.Diagnostics.Process.Start(startinfo);

        pptprocess.WaitForInputIdle();

        SetParent(pptprocess.MainWindowHandle, this.panel1.Handle);

我对 PPTViewer.exe 进行了同样的尝试,但我无法让 Powerpoint 幻灯片在表单内运行。它启动查看器,但在表单之外。

不确定我是否必须在这里做一些特别的事情。

4

1 回答 1

2

回答我自己的问题可以获得积分吗?

基本上,我使用 SPY++ 来查看查看器正在打开一个子窗口。子窗口是我想强制进入我的应用程序的窗口,所以我使用以下 API 调用来获取子窗口的句柄。

[DllImport("user32.dll")] 静态外部 IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);

对于 PPT 2003 或更低版本的文件,这工作正常(只能查看第一张幻灯片),但对于 PPT 2007,它仍然在我的表单之外打开。速度非常快,但是......

最后,我们决定不播放原生格式的 PPT,因为微软没有制作轻量级的 .net 控件来播放 PPT。我们也不想在后台启动 PPT,使用该方法启动 PPT 文件需要几秒钟,这是不可接受的性能。

所以,我们将 PPT 转换为 Flash 并使用 Flash active X 控件(速度超快)播放原始 PPT 内容。

这似乎是最好的解决方案。

于 2009-01-23T19:34:06.783 回答