如何在实时更新listBox中添加来自另一个类的项目?

时间:2015-09-30 02:43:09

标签: c# .net winforms

我在新课程中有这段代码:

private static bool EnumWindowsCallback(IntPtr hWnd, IntPtr lParam)
{
    bool specialCapturing = false;

    if (hWnd == IntPtr.Zero) return false;

    if (!IsWindowVisible(hWnd)) return true;

    if (!countMinimizedWindows)
    {
        if (IsIconic(hWnd)) return true;
    }
    else if (IsIconic(hWnd) && useSpecialCapturing) specialCapturing = true;

    if (GetWindowText(hWnd) == PROGRAMMANAGER) return true;

    windowSnaps.Add(new WindowSnap(hWnd, specialCapturing));
    doStuff(new WindowSnap(hWnd, specialCapturing));

    return true;
}

public static void doStuff(object objtoadd)
{
    foreach (Form frm in Application.OpenForms)
    {
        if (frm.GetType() == typeof(Form1))
        {
            Form1 frmTemp = (Form1)frm;
            frmTemp.addItemToListBox(objtoadd);

        }
    }
}

运行程序时,它就到了这一行:

doStuff(new WindowSnap(hWnd, specialCapturing));

但它永远不会过关:

if (frm.GetType() == typeof(Form1))

在form1中我做了:

public void addItemToListBox(object item)
{
    listBoxSnap.Items.Add(item);
}

但它从未调用addItemToListBox,因为它没有通过类中的行。

我的主要目标是在新类中一次实时更新form1(listBoxSnap)中的listBox,添加一个项目:

frmTemp.addItemToListBox(objtoadd);

然后在listBoxSnap中显示/显示项目,然后显示下一项,依此类推。 直到现在我做了:

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

但是这需要时间,因为它必须等待所有添加的项目,然后才能在listBoxSnap中显示它们。

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);
}

在这个方法中,它调用EnumWindowsCallback,我想更新listBoxSnap。

也许我需要以某种方式更新公共静态WindowSnapCollection GetAllWindows方法中的listBoxSnap。

1 个答案:

答案 0 :(得分:0)

对我来说代码太多了。但要回答这个问题。

既然你说real time我必须假设回调和DoStuff在非UI线程上运行。要对Control执行任何操作,您必须在UI线程上。您可以使用Control.Invoke执行此操作。

 public static void doStuff(object objtoadd)
 {
    foreach (Form1 frm in Application.OpenForms.OfType<Form1>())
    {
       frm.Invoke(() => frm.addItemToListBox(objtoadd));
    }
  }

请注意,OfType<Form1>()是在System.Linq中定义的。