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")] static extern 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 ではフォームの外で開きました。とても早かったのですが……。

最終的に、Microsoft は PPT を再生するための軽量の .net コントロールを作成していないため、PPT をネイティブ形式で再生しないことにしました。バックグラウンドで PPT を起動することも望ましくありません。また、この方法で PPT ファイルを起動するには数秒かかるため、許容できるパフォーマンスではありません。

そのため、PPT を Flash に変換し、Flash アクティブ X コントロール (超高速) を使用して元の PPT コンテンツを再生します。

これが最善の解決策のようです。

于 2009-01-23T19:34:06.783 に答える