我有一个按钮,点击一下,它就会截取一个屏幕截图,并显示在我的图片框中。我不会遇到这个代码的问题:
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();
}
}如何解决此问题?
发布于 2012-02-21 21:59:58
那是因为你的while()是无限的。是什么使flag在不同的捕获中发生变化?
如果你想无限地捕捉屏幕-永远不要使用主线程来做这类事情,因为它会导致它挂起并阻止你的应用程序更新UI。
使用BackgroundWorker class来做类似的事情,您可以使用this示例。
发布于 2012-02-21 22:06:50
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();
}
}发布于 2012-02-21 22:03:38
尝试在循环中使用Application.DoEvents。我想这能帮你..。
private void btnScreenShot_Click(object sender, EventArgs e)
{
// Freezes here
btnSave.Visible = true;
while(flag == 0)
{
Application.DoEvents();
sendto_bmpbox.Image = CaptureScreen();
}
}https://stackoverflow.com/questions/9378826
复制相似问题