2012-07-06 23 views
5

Quiero ser capaz de insertar una presentación de PowerPoint en un formulario de C# (WinForms). Básicamente tenemos un monitor de 52 ', y la idea es que en una esquina tendremos un PPT en el bucle, y luego las otras 3 esquinas mostrarán información del programa en sí.Incrustar un show de Powerpoint en una aplicación de C#

Esperaba que esto fuera sencillo, pero parece que estoy equivocado.

Me han recomendado usar el control WebBrowser, pero esto no funciona y en su lugar trata el archivo de PowerPoint como una descarga, es decir, me da un diálogo de "Guardar, Abrir".

¿Alguna sugerencia?

AK

+1

¿Su aplicación tiene que interactuar con la presentación? es posible que pueda arreglárselas con ejecutar ppt en una máquina virtual, de lo contrario ... – Adam

+1

Consulte http: // stackoverflow.com/questions/10955496/powerpoint-2010-multiple-instances/11737090 # 11737090 – TFD

Respuesta

8

Puede ejecutar PowerPoint, obtener el identificador de Windows y establecer una nueva ventana principal utilizando la función SetParent.


Todo lo que necesita es el nombre de la clase de ventana de la ventana de PowerPoint, pero gracias a Spy++, esto no es gran cosa.

spy++


Aquí hay una captura de pantalla de PowerPoint se ejecuta 'dentro' de una aplicación personalizada:

PowerPoint


Ejemplo completo (tomado de here y modificado para 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); 
} 
+0

Esto es genial, pero ¿habría una manera similar de ejecutar solo la presentación de diapositivas, en lugar de todo el entorno? – KingCronus

+0

Hay una configuración en PowerPoint para ejecutar una presentación de diapositivas en modo ventana en lugar de pantalla completa. Entonces se verá como [esto] (http://imagebin.org/220050). Tal vez eso sea suficiente para hacerte feliz :-) – sloth

+0

Creo que también podrías mostrar solo la parte deslizante de la ventana de PowerPoint. Tendría que usar [GetDlgItem] (http://msdn.microsoft.com/en-us/library/ms645481 (VS.85) .aspx) para obtener el control secundario 'MDIClient' de la ventana de PowerPoint, y luego obtener el control '' Slide 'paneClassDC' de ese control. Pero no probé esto. – sloth

0

que realmente no tienen idea de carnero es posible incrustar un ppt-espectador en WinForms. Tengo otra sugerencia para ti: utiliza el control del navegador (o descarga uno para webkit si quieres una mejor compatibilidad con html5) y utiliza una biblioteca js como impress.js para presentar la presentación. Solo un pensamiento.

espectador
+0

Desafortunadamente para mí, en este caso, el cliente proporciona el powerpoint, y necesitan poder cambiarlo con frecuencia y fácilmente con Powerpoint. – KingCronus

+0

Impress.js parece divertido, ¡puede que tenga que probarlo para otra cosa! – KingCronus

2

Un PowerPoint que es un control activo/X integrable debe ser el camino a seguir - se puede tratar this (al parecer no funciona - ver comentarios) o this

Ver this para incrustar Active X controles/en aplicaciones de Windows Forms

Si la ventana donde se va a mostrar el PowerPoint no cambia de tamaño también se puede convertir las diapositivas de PowerPoint en mapas de bits, y luego simplemente mostrar los mapas de bits

+0

Por más que lo intente, no he podido lograr que el control ActiveX funcione. Está fechado en 2007 y me pregunto si funciona en absoluto. En cuanto a los mapas de bits, sería una pena, ya que la idea es que el usuario final pueda actualizar el Powerpoint sin demasiados problemas. – KingCronus

+0

No probé ese control Active/X por mí mismo, parece que es el camino correcto, ¿ha tratado de buscar otros (googlear devuelve algunos hits, he agregado un enlace a mi respuesta)? Con respecto al "truco" del mapa de bits, debería ser posible crear un script de PowerPoint para generar los mapas de bits automáticamente. – MiMo

+0

gracias por la ayuda, pero cada control que he encontrado ya sea a) no funciona con Powerpoint 07 en adelante, o cuesta una cantidad prohibitiva. Aparte de eso, realmente no quiero tener que usar ActiveX si puedo evitarlo. – KingCronus

0

Iniciado por @danish, here.

Ver esto link. También puede mostrar el ppt en un control WebBrowser. This también podría ser útil.

Básicamente también le permite abrir ppt, en un Control WebBrowser que puede incrustar fácilmente. Avíseme si necesita más información al respecto.

Cuestiones relacionadas