我在循环中有一个循环来影响很多变量,之后我需要通过SendKeys以文本形式显示数据。发送并截图。但是当程序启动时,循环生成屏幕截图,但是在文本版本中,它只在最后一刻显示,当所有的屏幕截图都已经拍摄完
private void button1_Click(object sender, EventArgs e)
{
int ID = Convert.ToInt32(textBox1.Text); //Тип одежды
int drawable = Convert.ToInt32(textBox2.Text); //Кол-во одежды
int Z = Convert.ToInt32(textBox3.Text); //Кол-во цветов
int all = 1;
Thread.Sleep(2000);
for(int i = 0; i < drawable + 1; i++)
{
int m1 = 0;
for (int m=m1; m< Z + 1;m++)
{
SendKeys.Send("t");
SendKeys.Send("/setclothes " + ID + " " + i + " " + m);
m1 = m;
int l = 32;
string filename = String.Format("D:\Test\" + ID + "_" + i + "_" + m + ".png", l);
Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(printscreen as Image);
graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
printscreen.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
}
}
你的线程不允许图形(在另一个线程上)刷新。所以当图形。CopyFromScreen被调用,更改已经完成,但排队,所以没有实际的更改发生,直到主线程完成(你的函数结束)。
尝试使用:
Application.DoEvents();
在图形之前。CopyFromScreen行,在屏幕截图之前强制图形更新。
。
Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(printscreen as Image);
Application.DoEvents();
graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
printscreen.Save(filename, System.Drawing.Imaging.ImageFormat.Png);
注意:调用DoEvents将停止当前线程的工作,并在其他线程上工作。如果您在后台运行许多其他应用程序,这可能会大大减慢循环速度!
note2:我会在循环之外创建位图,除非你希望屏幕分辨率改变。为位图分配数百次空间很慢。