如何从窗口获取没有Handle编号的文本?

时间:2014-08-25 10:08:41

标签: c# .net winforms

我有两个类可以获得所有最小化的窗口:

第一个类是WindowSnap.cs:

WindowSnap.cs

第二个类是WindowSnapCollection.cs:

WindowSnapCollection.cs

在windowSnap的第一个类中,有一个名为GetAllWindows的方法:

public static WindowSnapCollection GetAllWindows(bool minimized, bool specialCapturring)
        {
            windowSnaps = new WindowSnapCollection();
            countMinimizedWindows = minimized;//set minimized flag capture
            useSpecialCapturing = specialCapturring;//set specialcapturing flag
            EnumWindowsCallbackHandler callback = new EnumWindowsCallbackHandler(EnumWindowsCallback);
            EnumWindows(callback, IntPtr.Zero);
            return new WindowSnapCollection(windowSnaps.ToArray(), true);
        }

最后我在返回行上使用断点,windowSnaps变量包含15个项目。 例如,第一项是:

[0] = {Window Text:,Handle:31918532}

第二个是:

[3] = {窗口文本:?如何从窗口中仅获取没有句柄编号的文本? - Stack Overflow - 谷歌浏览器?,句柄:64424060}

在第一项中,我可以自行删除此项目,因为它的文字仅为","这个窗口什么都没有显示。

但是数字[3]和其他项目我想首先从它们中移除部分句柄:64424060 我不需要用户看到此信息。但是只有例如数字[3]的文本应该是这样的:

?如何从窗口获取没有Handle编号的文本? - Stack Overflow - Google Chrome?

并修复那些"?"这是在行的开头。 但我们的想法是只显示每个窗口的名称,而不是显示句柄号的整个文本。

这是我如何将项目(窗口)添加到form1 listBox:

this.listBoxSnap.Items.AddRange(WindowSnap.GetAllWindows(true, true).ToArray());

在listBox中,我希望看到项目名称或描述/标题,而不是整个文本的句柄号。

1 个答案:

答案 0 :(得分:1)

你可以做一个小技巧。这不好,但有效。在listBoxSnap上添加一个新的列表框,例如listBox1,大小相同。

添加public Form1()

public Form1()
    {
        ...
        for (int i = listBoxSnap.Items.Count - 1; i >= 0; i--)
        {
            string tt = listBoxSnap.Items[i].ToString();
            if (tt.Contains(" ,"))
            {
                listBoxSnap.Items.RemoveAt(i);
            }
        }
        buttonSnap.Enabled = true;
//add here ->
        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);
        }

        listBox1.Items.AddRange(myList);

        rectangles = new Rectangle[listBoxSnap.Items.Count];
        isCropped = new bool[listBoxSnap.Items.Count];

        if (this.listBoxSnap.Items.Count > 0)
        {
            this.listBoxSnap.SetSelected(0, true);
            this.listBox1.SetSelected(0, true);
        }
        listBoxSnap.Select();
        listBox1.Select();
   }

private void listBoxSnap_SelectedIndexChanged(object sender, EventArgs e)更改为:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        listBoxSnap.SelectedIndex = listBox1.SelectedIndex;

        drawpicbox(this.listBoxSnap.SelectedIndex);
    }

并从this.listBoxSnap.SelectedIndexChanged += new System.EventHandler(this.listBoxSnap_SelectedIndexChanged);

中删除Form1.Designer.cs

添加此活动:

private void listBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            var item = listBox1.IndexFromPoint(e.Location);
            if (item >= 0)
            {
                listBox1.SelectedIndex = item;
                listBoxSnap.SelectedIndex = listBox1.SelectedIndex;
                cm.Show(listBox1, e.Location);
            }
        }
    }

最后加入private void RefreshWindowsList()

private void RefreshWindowsList()
    {
        ...   
        for (int i = listBoxSnap.Items.Count - 1; i >= 0; i--)
        {
            string tt = listBoxSnap.Items[i].ToString();
            if (tt.Contains(" ,"))
            {
                listBoxSnap.Items.RemoveAt(i);
            }
        }
//add here ->
        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);
        }

        listBox1.Items.Clear();
        listBox1.Items.AddRange(myList);

        rectangles = new Rectangle[listBoxSnap.Items.Count];
        isCropped = new bool[listBoxSnap.Items.Count];

        textBoxIndex.Text = listBoxSnap.Items.Count.ToString();
        if (this.listBoxSnap.Items.Count > 0)
        {
            this.listBoxSnap.SetSelected(0, true);
            this.listBox1.SetSelected(0, true);
        }
        listBoxSnap.Select();
        listBox1.Select();
    }

瓦尔特