2011-05-17 129 views
1

我只用C#工作了几个星期,而且我已经陷入了线程问题。定制Powerpoint幻灯片

我一直在构建一个自定义的幻灯片,实现了由独立的类处理的winform中托管的.ppt演示文稿。幻灯片放映与另一个显示车间动态数据的程序关闭。第二个程序需要发送一个命令进入全屏模式,因为我无法访问它的源代码。

使用Setforegroundwindow API我可以轻松地在两个应用程序之间切换,并使用COM接口控制电源点,但在屏幕调整大小时转换不连贯。我想叠加一个空白的黑色Winform,在这个转换发生时淡入淡出。到目前为止,我一直没有顺利地做到这一点,我尝试过在单独的线程上运行淡入淡出的表单和过渡,但我没有弄明白。如果任何人可能有任何建议如何做到这一点,将不胜感激。

谢谢。

回答

0

通过一些示例代码的工作后,我实现了一个后台工作人员,做到了这一点。欲了解更多信息,请致电From msdn - How to: Use a Background Worker

我试图找到一种更可靠的方法来确保应用程序处理F11命令,但现在我已将Send.Seep之前放入了一个Thread.Sleep。

请随时留下意见或问题。

[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   
      } 

    } 

而且对于进出淡出形式代码..

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

一个想法...

有两个PPT装载机。

当前正在载入的和正在载入的新载入。

保持当前可见和活动,直到新的准备就绪。然后一旦新的准备好就隐藏当前的一个。这应该给你一个很好的过渡。

由于会有两个观看者处于活动状态,因此会占用更多的资源,但切换应该更平滑。

可能想区分加载与开始。这样你可以加载scenese后面,一旦加载,显示并启动ppt。

+0

谢谢你的想法。我正在寻找一名后台工作人员加载可能会减少加载时间的演示文稿。 但是为了澄清,我只有一个简报演示文稿,我已经设法通过使用shell主机将其嵌入到winform中来处理它。另一个程序显示有效的CNC机床,不能通过COM接口进行控制。在我等待进程闲置后,我必须使用SetForegroundWindow和SendKeys,才能启用全屏模式。 转换工作正常,但用户可以观看应用程序切换和窗口随时洗牌并调整大小。 – 2011-05-17 18:58:53