5

我希望能够将 powerpoint 演示文稿嵌入到 C# 表单 (WinForms) 中。基本上我们有一个 52' 的显示器,想法是在一个角落我们将有一个 PPT on loop,然后其他 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

我真的不知道是否可以在 winforms 中嵌入一个 ppt-viewer。我确实有另一个建议给你:使用浏览器控件(如果你想要更好的 html5 支持,或者下载一个用于 webkit 的控件)并使用像 impress.js 这样的 js 库来呈现演示文稿。只是一个想法。

于 2012-07-06T10:59:00.327 回答
0

最初由@danish 发布,在这里

请参阅此链接。您还可以在 WebBrowser 控件中显示 ppt。也可能有用。

基本上,它还允许您在可以轻松嵌入的 WebBrowser 控件中打开 ppt。如果您需要有关它的更多信息,请告诉我。

于 2012-07-09T08:31:11.930 回答