我如何在实时更新列表框添加项目从另一个类
本文关键字:项目 添加 另一个 列表 实时更新 | 更新日期: 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));
}
}
注意OfTypeSystem.Linq
中有定义