2012-07-06 10 views
5

Desidero essere in grado di incorporare una presentazione in PowerPoint in un modulo C# (WinForms). Fondamentalmente abbiamo un monitor da 52 ', e l'idea è che in un angolo avremo un loop in PPT, e poi gli altri 3 visualizzeranno le informazioni dal programma stesso.Incorporamento di un PowerPoint in un'applicazione C#

Mi aspettavo che fosse semplice, ma a quanto pare mi sbaglio.

Mi era stato consigliato di utilizzare il controllo WebBrowser, ma questo non funziona e invece tratta il file powerpoint come un download, cioè mi dà una finestra di dialogo "Salva, Apri".

Qualche suggerimento?

AK

+1

la tua applicazione deve interagire con la presentazione? potresti essere in grado di accontentarti di eseguire ppt in una macchina virtuale altrimenti ... – Adam

+1

Vedi http: // StackOverflow.it/questions/10955496/powerpoint-2010-multiple-instances/11737090 # 11737090 – TFD

risposta

8

È possibile eseguire PowerPoint, ottenere l'handle di Windows e impostare una nuova finestra genitore utilizzando la funzione SetParent.


Tutto ciò che serve è il nome della classe di finestra della finestra di PowerPoint, ma grazie a Spy++, questo è un grosso problema.

spy++


Ecco uno screenshot di PowerPoint in esecuzione 'dentro' di un'applicazione personalizzata:

PowerPoint


esempio completa (tratto da here e modificato per 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

Questo è fantastico, ma ci sarebbe un modo simile per eseguire solo la presentazione, piuttosto che l'intero ambiente? – KingCronus

+0

Esiste un'impostazione in PowerPoint per eseguire una presentazione in modalità finestra anziché a schermo intero. Quindi sembrerà [questo] (http://imagebin.org/220050). Forse è abbastanza per renderti felice :-) – sloth

+0

Credo che potresti anche visualizzare solo la parte slide della finestra di PowerPoint. Dovresti utilizzare [GetDlgItem] (http://msdn.microsoft.com/en-us/library/ms645481 (VS.85) .aspx) per ottenere il controllo figlio 'MDIClient' della finestra di PowerPoint, e quindi ottenere il controllo '" Slide "paneClassDC' da quel controllo. Ma non ho provato questo. – sloth

0

Io davvero non hanno alcuna idea di montone castrato è possibile incorporare un ppt-spettatore in WinForms. Ho un altro suggerimento per te: usa il controllo del browser (o scaricalo per il webkit se vuoi un supporto html5 migliore) e usa una libreria js come impress.js per presentare la presentazione. Solo un pensiero.

+0

Sfortunatamente per me in questo caso il client fornisce il powerpoint, e devono essere in grado di cambiarlo frequentemente e facilmente con powerpoint. – KingCronus

+0

Anche se Impress.js sembra divertente, potrei doverlo provare per qualcos'altro! – KingCronus

2

Un Visualizzatore di PowerPoint che è un embeddable controllo attivo/X dovrebbe essere la strada da percorrere - si può provare this (a quanto pare non funziona - vedi commenti) oppure this

Vedi this per l'incorporamento attivi/X controlli in applicazioni Windows Forms

Se la finestra in cui si prevede di visualizzare PowerPoint non cambia dimensioni si potrebbe anche convertire le diapositive PowerPoint in bitmap, e poi basta visualizzare i bitmap

+0

Per quanto possibile, non sono riuscito a far funzionare il controllo ActiveX. È datato 2007 e mi chiedo se funziona a tutti. Per quanto riguarda Bitmap, sarebbe un problema poiché l'idea è che l'utente finale possa aggiornare il Powerpoint senza troppi problemi. – KingCronus

+0

Non ho provato me stesso il controllo Active/X - sembra il modo di andare da me, hai provato a cercarne altri (Googling restituisce qualche hit - ho aggiunto un link alla mia risposta)? Per quanto riguarda il "trucco" bitmap dovrebbe essere possibile scrivere PowerPoint per generare automaticamente i bitmap. – MiMo

+0

grazie per l'assistenza, ma ogni controllo che ho trovato a) non funziona con Powerpoint 07 in poi, o costa un importo proibitivo. A parte questo, non voglio davvero usare ActiveX se posso aiutarlo. – KingCronus

0

originariamente postato da @danish, here.

Vedere questo link. È inoltre possibile visualizzare il ppt in un controllo WebBrowser. This potrebbe anche essere utile.

Fondamentalmente consente di aprire ppt, in un controllo WebBrowser che è possibile incorporare facilmente. Fammi sapere se hai bisogno di maggiori informazioni a riguardo.