如何每隔X分钟刷新一个特定的hWnd窗口?

时间:2015-09-29 23:08:04

标签: c# .net winforms

我正在做的是在后台捕获窗口的屏幕截图。 在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类有点长,所以我会给它一个链接,我不想在这里添加它:

WindowSnap.cs

它还使用WindowSnapCollection.cs类

WindowSnapCollection.cs

这个想法再次以某种方式刷新集合中的特定hWnd窗口并刷新ListBox。

1 个答案:

答案 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());