我如何在实时更新列表框添加项目从另一个类

本文关键字:项目 添加 另一个 列表 实时更新 | 更新日期: 2023-09-27 18:15:06

我在一个新类中有以下代码:

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

And in form1 i did:

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

但是它从来没有调用过addItemToListBox,因为它没有在类中传递行。

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

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。

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

我如何在实时更新列表框添加项目从另一个类

代码太多了。但是要回答这个问题。

既然你说real time,我必须假设回调和DoStuff在非ui线程上运行。做任何与Control你必须在UI线程。你可以使用Control。

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

注意OfType()在System.Linq中有定义