屏幕捕获问题
我有一个按钮,其中的一个点击,它需要我在我的图片框中显示的屏幕截图。我不面对的问题与此代码:屏幕捕获问题
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();
}
}
如何解决这个问题?
这是因为你的while()
是无限的。是什么让flag
从捕捉变为捕捉?
如果你想无限捕捉屏幕 - 从来没有使用主线程这样的事情,因为它会导致它挂起,并阻止你的应用程序更新用户界面。
对于这样的事情使用BackgroundWorker class,可以使用this示例。
尝试Application.DoEvents循环。我认为这可以帮助你......
private void btnScreenShot_Click(object sender, EventArgs e)
{
// Freezes here
btnSave.Visible = true;
while(flag == 0)
{
Application.DoEvents();
sendto_bmpbox.Image = CaptureScreen();
}
}
'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();
}
}
我也会处理旧图像。否则GC将非常不高兴。 – CodesInChaos 2012-02-21 14:11:16
是的,你是对的:) – Lev 2012-02-21 16:02:36
它锁起来,因为你阻挡在你的循环。如果你希望能够在这个过程正在进行的过程中与你的表单进行交互,你应该把循环放到另一个线程中。 – 2012-02-21 14:01:02