我在新课程中有这段代码:
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。
答案 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
中定义的。