我正在尝试编写一个迭代顶级窗口的函数,如果它们满足一组条件,则将它们放入列表中。目前我可以通过将窗口添加到静态List<IntPtr> instances
变量中来实现此功能,但我希望将指针传递给EnumWindowsProc
的{{1}}中的列表。为了避免这个静态变量。
我想我必须使用lParam
来修复列表在内存中的位置,但我不确定如何执行此操作。我试过这个将列表传递给我的回调函数:
fixed
但我得到
unsafe
{
fixed (void* dp = &instances)
{
WinApi.EnumWindows(new WinApi.EnumWindowsProc(FindPPWindows), dp);
}
}
我对c#很新,所以我真的不知道如何做到这一点 - 或者即使可能,我已经读过,编组包含引用的托管类型是不可能的,但我只需要在内存中修复它创建一个指向它的指针,然后将指针强制转换并使用它。如果有的话,我怎样才能完成这项工作?
答案 0 :(得分:2)
您可以使用lambda表达式调用EnumWindows函数。然后EnumWindowsProc Callback将是内联的,您可以访问本地变量:
List<IntPtr> list = new List<IntPtr>();
WinApi.EnumWindows((hWnd, lParam) =>
{
//check conditions
list.Add(hWnd);
return true;
}, IntPtr.Zero);
您可以在额外的功能中封装此内联调用,例如:
List<IntPtr> GetMatchingHWnds()
{
List<IntPtr> list = new List<IntPtr>();
WinApi.EnumWindows((hWnd, lParam) =>
{
//check conditions
list.Add(hWnd);
return true;
}, IntPtr.Zero);
return list;
}