我正在做的是在后台捕获窗口的屏幕截图。 在ListBox中我有一些Windows项目我正在截图。 这个想法是窗户在后台,所以我不需要每次都将窗户移到前台。
在form1构造函数中:
this.listBoxSnap.Items.AddRange(WindowSnap.GetAllWindows(true, true).ToArray());
然后在form1中我还有一个RefreshWindowsList方法:
private void RefreshWindowsList()
{
Graphics g;
g = Graphics.FromImage(img);
g.Clear(Color.Transparent);
buttonSnap.Enabled = true;
this.listBoxSnap.Items.Clear();
this.listBoxSnap.Items.AddRange(WindowSnap.GetAllWindows(true, true).ToArray());
for (int i = listBoxSnap.Items.Count - 1; i >= 0; i--)
{
string tt = listBoxSnap.Items[i].ToString();
if (tt.Contains(" ,"))
{
listBoxSnap.Items.RemoveAt(i);
}
}
string[] myList = new string[listBoxSnap.Items.Count];
for (int i = 0; i < listBoxSnap.Items.Count; i++)
{
string tt = listBoxSnap.Items[i].ToString();
int index = tt.LastIndexOf(",");
myList[i] = tt.Substring(0, index);
}
textBoxIndex.Text = listBoxSnap.Items.Count.ToString();
if (this.listBoxSnap.Items.Count > 0)
{
this.listBoxSnap.SetSelected(0, true);
}
listBoxSnap.Select();
}
问题是,如果我每隔X秒/分钟调用此方法,我将进行刷新,ListBox将闪烁。 所以我想知道是否有办法只刷新WindowSnap.GetAllWindows集合中的特定窗口,而不是刷新ListBox。
因此,如果我刷新特定的hWnd窗口并将窗口图像保存为硬盘上的屏幕截图,我将看不到ListBox上的任何更改,但我会在硬盘上保存一组图像。
WindowSnap类有点长,所以我会给它一个链接,我不想在这里添加它:
它还使用WindowSnapCollection.cs类
这个想法再次以某种方式刷新集合中的特定hWnd窗口并刷新ListBox。
答案 0 :(得分:0)
要在清除和重新加载ListBox
的项目时禁用闪烁,您可以使用BeginUpdate()
和EndUpdate()
ListBox
控件的方法,例如在间隔为1000 I的计时器中写了这段代码,ListBox
中没有闪烁:
private void timer1_Tick(object sender, EventArgs e)
{
this.listBox1.BeginUpdate();
this.listBox1.Items.Clear();
for (int i = 0; i < 100; i++)
{
this.listBox1.Items.Add(i);
}
this.listBox1.EndUpdate();
}
此外,您可以将新项目放入列表中,然后使用以下命令添加:
listBox1.Items.AddRange(yourItemsList.Cast<object>().ToArray());