屏幕捕获问题

问题描述:

我有一个按钮,其中的一个点击,它需要我在我的图片框中显示的屏幕截图。我不面对的问题与此代码:屏幕捕获问题

private void btnScreenShot_Click(object sender, EventArgs e) 
     { 

      btnSave.Visible = true; 
      sendto_bmpbox.Image = CaptureScreen(); 
     } 

然而,当我循环整个表格冻结,我无法点击任何东西:

private void btnScreenShot_Click(object sender, EventArgs e) 
     { 
      // Freezes here 
      btnSave.Visible = true; 
      while(flag == 0) 
      { 
       sendto_bmpbox.Image = CaptureScreen(); 
      } 
     } 

如何解决这个问题?

+0

它锁起来,因为你阻挡在你的循环。如果你希望能够在这个过程正在进行的过程中与你的表单进行交互,你应该把循环放到另一个线程中。 – 2012-02-21 14:01:02

这是因为你的while()是无限的。是什么让flag从捕捉变为捕捉?

如果你想无限捕捉屏幕 - 从来没有使用主线程这样的事情,因为它会导致它挂起,并阻止你的应用程序更新用户界面。

对于这样的事情使用BackgroundWorker class,可以使用this示例。

+0

我想循环无限运行.....我有另一个按钮,它停止捕捉...并将标志设置为非零。 – Tempo 2012-02-21 14:02:25

+0

@Tempo查看编辑 – Shai 2012-02-21 14:04:41

尝试Application.DoEvents循环。我认为这可以帮助你......

private void btnScreenShot_Click(object sender, EventArgs e) 
     { 
      // Freezes here 
      btnSave.Visible = true; 
      while(flag == 0) 
      { 
       Application.DoEvents(); 
       sendto_bmpbox.Image = CaptureScreen(); 
      } 
     } 
+0

'DoEvents'是一种恶劣的习惯。 – Shai 2012-02-21 14:05:03

private void button1_Click(object sender, EventArgs e) 
     { 
      btnSave.Visible = true; 

      Thread thread = new Thread(new ThreadStart(threadWork)); 
      thread.Start(); 
     } 

     int flag = 0; 

     private void threadWork() 
     { 
      while (flag == 0) 
      { 
       UpdateImage(); 
      } 
     } 

     private void UpdateImage() 
     { 
      if (this.InvokeRequired) 
      { 
       this.Invoke(UpdateImage); 
      } 
      else 
      { 
       sendto_bmpbox.Image = CaptureScreen(); 
      } 
     } 
+0

我也会处理旧图像。否则GC将非常不高兴。 – CodesInChaos 2012-02-21 14:11:16

+0

是的,你是对的:) – Lev 2012-02-21 16:02:36