5

パワーポイント プレゼンテーションを C# フォーム (WinForms) に埋め込めるようにしたいと考えています。基本的には 52 インチのモニターを使用しており、1 つのコーナーに PPT をループさせ、他の 3 つのコーナーにプログラム自体からの情報を表示するという考えです。

これは簡単だと思っていましたが、間違っているようです。

WebBrowser コントロールを使用するようにアドバイスされていましたが、これは機能せず、代わりに PowerPoint ファイルをダウンロードとして扱います。つまり、[保存して開く] ダイアログが表示されます。

助言がありますか?

AK

4

4 に答える 4

8

PowerPoint を実行し、ウィンドウ ハンドルを取得し、SetParent関数を使用して新しい親ウィンドウを設定するだけです。


必要なのは PowerPoint ウィンドウのウィンドウ クラスの名前だけですが、Spy++のおかげで、これは大したことではありません。

スパイ++


これは、カスタム アプリケーションの「内部」で実行されている PowerPoint のスクリーンショットです。

パワーポイント


完全な例 (ここから取得し、PowerPoint 用に変更):

public partial class Form1 : Form
{
    public Form1()
    {
        this.Size = new System.Drawing.Size(800, 600);
        this.TopMost = true;
        this.Text = "My Application";
        this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
        Func<bool> run = () =>
            Window.Find(hwnd =>
            {
                var cn = Window.GetClassName(hwnd);
                var res = (cn == "PPTFrameClass");
                if (res)
                {
                    this.Controls.Clear();
                    Window.SetParent(hwnd, this.Handle);
                    Window.SetWindowPos(hwnd, new IntPtr(0), -8, -30, this.Width + 10, this.Height + 37, 0x0040);
                }
                return res;
            });

        new Button { Parent = this, Text = "Start" }
            .Click += (s, e) =>
            {
                if (run() == false)
                    MessageBox.Show("Open PowerPoint");
            };
    }
}

public static class Window
{
    public static bool Find(Func<IntPtr, bool> fn)
    {
        return EnumWindows((hwnd, lp) => !fn(hwnd), 0) == 0;
    }
    public static string GetClassName(IntPtr hwnd)
    {
        var sb = new StringBuilder(1024);
        GetClassName(hwnd, sb, sb.Capacity);
        return sb.ToString();
    }
    public static uint GetProcessId(IntPtr hwnd)     // {0:X8}
    {
        uint pid;
        GetWindowThreadProcessId(hwnd, out pid);
        return pid;
    }
    public static string GetText(IntPtr hwnd)
    {
        var sb = new StringBuilder(1024);
        GetWindowText(hwnd, sb, sb.Capacity);
        return sb.ToString();
    }

    delegate bool CallBackPtr(IntPtr hwnd, int lParam);

    [DllImport("user32.dll")]
    static extern int EnumWindows(CallBackPtr callPtr, int lPar);

    [DllImport("user32.dll")]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

    [DllImport("User32", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int W, int H, uint uFlags);
}
于 2012-07-09T08:31:56.640 に答える
2

埋め込み可能なActive/XコントロールであるPowerPointビューアが最適です-これを試すことができます明らかに機能しません-コメントを参照してください)またはこれ

WindowsフォームアプリケーションにActive/Xコントロールを埋め込むには、これを参照してください

PowerPointを表示する予定のウィンドウのサイズが変わらない場合は、PowerPointスライドをビットマップに変換してから、ビットマップを表示することもできます。

于 2012-07-09T08:14:58.767 に答える
0

もともと @danish によって投稿された、こちら.

このリンクを参照してください。WebBrowser コントロールに ppt を表示することもできます。これも役に立つかもしれません。

基本的に、簡単に埋め込むことができる WebBrowser コントロールで ppt を開くこともできます。それについてさらに情報が必要な場合はお知らせください。

于 2012-07-09T08:31:11.930 に答える
0

winforms に ppt-viewer を埋め込むことができるかどうか、私にはまったくわかりません。もう 1 つ提案があります。ブラウザー コントロールを使用し (または、より良い html5 サポートが必要な場合は Webkit 用にダウンロードし)、impress.js などの js ライブラリを使用してプレゼンテーションを表示します。ちょっとした考え。

于 2012-07-06T10:59:00.327 に答える