2012-07-06 3 views
5

Je souhaite intégrer une présentation PowerPoint dans un formulaire C# (WinForms). Fondamentalement, nous avons un moniteur 52 ', et l'idée est que dans un coin, nous aurons un PPT sur la boucle, puis les 3 autres coins afficheront des informations du programme lui-même.Intégration d'un diaporama Powerpoint dans une application C#

Je m'attendais à ce que ce soit simple, mais il semble que je me trompe.

Il m'avait été conseillé d'utiliser le contrôle WebBrowser, mais cela ne fonctionne pas et traite à la place le fichier powerpoint en téléchargement, c'est-à-dire qu'il affiche une boîte de dialogue "Enregistrer, Ouvrir".

Des suggestions?

AK

+1

Est-ce que votre application doit interagir avec la présentation? vous pouvez peut-être faire avec ppt en cours d'exécution dans une machine virtuelle sinon ... – Adam

+1

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

Répondre

8

Vous pouvez simplement exécuter PowerPoint, obtenir le handle de Windows et définir une nouvelle fenêtre parent en utilisant la fonction SetParent.


Tout ce que vous avez besoin est le nom de la classe de la fenêtre de la fenêtre PowerPoint, mais grâce à Spy++, c'est pas une grosse affaire.

spy++


Voici une capture d'écran de PowerPoint en cours d'exécution 'à l'intérieur' d'une application personnalisée:

PowerPoint


Exemple complet (extrait de here et modifié pour 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

C'est génial, mais y aurait-il une façon similaire de lancer seulement le diaporama, plutôt que l'environnement entier? – KingCronus

+0

Il existe un paramètre dans PowerPoint pour exécuter un diaporama en mode fenêtré au lieu de plein écran. Ensuite, il ressemblera à [this] (http://imagebin.org/220050). Peut-être que c'est assez pour vous rendre heureux :-) – sloth

+0

Je crois que vous pourriez également afficher seulement la partie de la diapositive de la fenêtre PowerPoint. Vous devez utiliser [GetDlgItem] (http://msdn.microsoft.com/en-us/library/ms645481 (VS.85) .aspx) pour obtenir le contrôle enfant 'MDIClient' de la fenêtre PowerPoint, puis obtenir le '' Slide "paneClassDC' contrôle de ce contrôle. Mais je n'ai pas testé ça. – sloth

0

Je ne sais vraiment pas wether il est possible d'intégrer un ppt-spectateur dans WinForms. J'ai une autre suggestion pour vous: Utilisez le contrôle du navigateur (ou téléchargez-en un pour webkit si vous voulez un meilleur support html5) et utilisez une librairie js comme impress.js pour présenter la présentation. Juste une pensée.

+0

Malheureusement pour moi dans ce cas, le client fournit le powerpoint, et ils doivent pouvoir le changer fréquemment et facilement avec powerpoint. – KingCronus

+0

Impress.js semble amusant, je vais devoir l'essayer pour autre chose! – KingCronus

2

Une visionneuse PowerPoint est un contrôle incorporable actif/X doit être la voie à suivre - vous pouvez essayer this (apparemment ça ne marche pas - voir les commentaires) ou this

Voir this pour intégrer les contrôles Active/X dans les applications Windows Forms

Si la fenêtre où vous prévoyez d'afficher le PowerPoint ne change pas de taille, vous pouvez également convertir les diapositives PowerPoint en bitmaps, puis afficher uniquement les bitmaps

+0

Essayez comme je pourrais, j'ai été incapable de faire fonctionner ce contrôle ActiveX. Il est daté 2007 et je me demande si cela fonctionne du tout. Quant aux bitmaps, ce serait une douleur car l'idée est que l'utilisateur final soit capable de mettre à jour le Powerpoint sans trop de problèmes. – KingCronus

+0

Je n'ai pas essayé moi-même le contrôle Active/X - il me semble que c'est le chemin à suivre, as-tu essayé d'en chercher d'autres (Googling ça renvoie des hits - j'ai ajouté un lien vers ma réponse)? En ce qui concerne l'astuce du bitmap, il devrait être possible de créer un script pour PowerPoint afin de générer automatiquement les bitmaps. – MiMo

+0

merci pour l'aide, mais chaque contrôle que j'ai trouvé soit a) ne fonctionne pas avec Powerpoint 07 ou coûte un montant prohibitif. En dehors de cela, je ne veux pas vraiment avoir à utiliser ActiveX si je peux l'aider. – KingCronus

0

posté par @danish, here.

Voir ceci link. Vous pouvez également afficher le ppt dans un contrôle WebBrowser. This pourrait également être utile.

Fondamentalement, il vous permet également d'ouvrir ppt, dans un contrôle WebBrowser que vous pouvez facilement intégrer. Faites-moi savoir si vous avez besoin de plus d'informations à ce sujet.

Questions connexes