2011-05-17 4 views
1

Je travaille uniquement avec C# depuis quelques semaines et je me suis retrouvé bloqué sur un problème de threading.Diaporama Powerpoint personnalisé

J'ai construit un diaporama personnalisé qui implémente une présentation ppt hébergé dans un WinForm géré par une classe indépendante. Le diaporama s'éteint avec un autre programme qui affiche des données dynamiques provenant d'un atelier. Ce second programme doit recevoir une commande pour passer en mode plein écran car je n'ai pas accès à son code source.

Utilisation de l'API SetForegroundWindow je peux facilement basculer entre les deux applications et contrôler le point d'alimentation avec l'interface COM, mais la transition est saccadée avec le redimensionnement des écrans. Je voudrais superposer un winform noir vide qui apparaît et disparaît pendant que cette transition se produit. Jusqu'à présent, je n'ai pas réussi à le faire en douceur, j'ai essayé d'exécuter la forme de fondu et la transition sur des fils séparés, mais je ne l'ai pas compris. Si quelqu'un peut avoir des conseils sur la façon de faire cela, il serait très apprécié.

Merci.

Répondre

0

Après avoir travaillé quelques exemples de code, je mis en œuvre un travailleur de fond qui a fait l'affaire. Pour plus d'informations From msdn - How to: Use a Background Worker.

J'essaie de trouver une manière plus fiable de m'assurer que la commande F11 est traitée par l'application, mais pour l'instant j'ai mis un Thread.Sleep avant les SendKeys.

N'hésitez pas à laisser des commentaires ou questions.

[DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool SetForegroundWindow(IntPtr hWnd); 

    Process p; 
    //Process p is initialized: p = Process.Start(@"<path\application.exe>"); 
    Form2 oForm; 

private void transition() 
    { 
     BackgroundWorker bw = new BackgroundWorker(); 
     oForm = new Form2(); 

     bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
     bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
     oForm.Show(); 
     if (bw.IsBusy != true) 
     { 
      bw.RunWorkerAsync(); 
     } 

    } 
    private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    {  
     oForm.closethis(); 
    } 
    private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 

      if ((worker.CancellationPending == true)) 
      { 
       e.Cancel = true;     
      } 
      else 
      {     
       SetForegroundWindow(p.MainWindowHandle); 
       p.WaitForInputIdle(3000); 
       System.Threading.Thread.Sleep(500); 
       SendKeys.SendWait("{F11}");  
       //Sends the application into full screen mode   
      } 

    } 

Et le code pour la forme qui se fane dans et hors ..

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     this.Visible = false; 
     this.Opacity = 0; 

     InitializeComponent(); 

     this.TopMost = true; 
     this.Visible = true; 

     while (this.Opacity < 1) 
     { 
      this.Opacity += .05; 
      Thread.Sleep(5); 
      this.TopMost = true; 
     }  
    } 
    private void closefade() 
    { 
     while (this.Opacity > 0) 
     { 
      this.Opacity -= .05; 
      Thread.Sleep(5); 
      this.TopMost = true; 
     } 
     this.Close(); 
    } 

    delegate void CloseBack(); 
    public void closethis() 
    { 
     if (this.InvokeRequired) 
     { 
      CloseBack b = new CloseBack(closethis); 
     } 
     else 
      closefade(); 
    } 
} 
0

Une pensée ...

Avoir deux chargeurs ppt.

L'actuel et le nouveau que vous chargez.

Conserver le visible et actif courant jusqu'à ce que le nouveau est prêt. Puis, une fois que le nouveau est prêt, cachez le courant. Cela devrait vous donner une belle transition.

Comme il y aura deux téléspectateurs actifs, ce sera un peu plus de ressources, mais la transition devrait être plus lisse.

voudrez peut-être par rapport à partir du chargement permettent de distinguer. De cette façon vous pouvez charger derrière le scenese et une fois chargé, montrer et commencer le ppt.

+0

Merci pour les idées. Je cherchais un arrière-plan pour charger la présentation, ce qui peut réduire le temps de chargement. Mais pour clarifier, j'ai seulement une présentation powerpoint et j'ai réussi à le gérer en utilisant un shell-hôte pour l'intégrer dans un winform. L'autre programme affiche les machines CNC actives et ne peut pas être contrôlé via une interface COM. Je dois utiliser SetForegroundWindow suivi d'un SendKeys, après avoir attendu le processus d'inactivité, pour activer le mode plein écran. La transition fonctionne mais l'utilisateur regarde le commutateur d'applications et les fenêtres défilent et redimensionnent entre temps. –

Questions connexes