EnumChildWindows 以与我在实际 Window 中看到的不同的顺序获取子 windows
EnumChildWindows get child windows in different order what I see in actual Window
我需要列出 Windows 的所有子控件,但顺序与 window 中出现的顺序完全相同。
我有这个代码;
public static List<IntPtr> GetWindowControls(IntPtr hWnd)
{
List<IntPtr> result = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(result);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindowControls);
EnumChildWindows(hWnd, childProc, GCHandle.ToIntPtr(listHandle));
}
finally
{
if (listHandle.IsAllocated)
listHandle.Free();
}
return result;
}
private static bool EnumWindowControls(IntPtr handle, IntPtr pointer)
{
GCHandle gch = GCHandle.FromIntPtr(pointer);
List<IntPtr> list = gch.Target as List<IntPtr>;
if (list == null)
throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");
string className = Helpers.WinApi.GetWinClass(handle).ToUpper();
if (className.Contains("EDIT") || className.Contains("COMBOBOX") || className.Contains("STATIC") || className.Contains("BUTTON"))
list.Add(handle);
return true;
}
执行该方法后,我得到一个 Windows 列表,但顺序不限。
EnumChildWindows
不会按照您想要的顺序给您 windows。您必须向每个 window 询问其位置,然后根据这些位置自行订购 windows。
您需要决定使用什么顺序。从上到下,然后从左到右。或者从左到右,然后到底部。或者也许是其他命令。
您可以使用 GetWindowRect
获取每个 window 的边界矩形。
EnumChildWindows 通过将句柄传递给每个子 window 来枚举属于指定父 window 的子 windows,它们是基于 windows Z 枚举的订单。
为所有 windows 设置正确的 Z 顺序将解决您的问题
我需要列出 Windows 的所有子控件,但顺序与 window 中出现的顺序完全相同。
我有这个代码;
public static List<IntPtr> GetWindowControls(IntPtr hWnd)
{
List<IntPtr> result = new List<IntPtr>();
GCHandle listHandle = GCHandle.Alloc(result);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindowControls);
EnumChildWindows(hWnd, childProc, GCHandle.ToIntPtr(listHandle));
}
finally
{
if (listHandle.IsAllocated)
listHandle.Free();
}
return result;
}
private static bool EnumWindowControls(IntPtr handle, IntPtr pointer)
{
GCHandle gch = GCHandle.FromIntPtr(pointer);
List<IntPtr> list = gch.Target as List<IntPtr>;
if (list == null)
throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");
string className = Helpers.WinApi.GetWinClass(handle).ToUpper();
if (className.Contains("EDIT") || className.Contains("COMBOBOX") || className.Contains("STATIC") || className.Contains("BUTTON"))
list.Add(handle);
return true;
}
执行该方法后,我得到一个 Windows 列表,但顺序不限。
EnumChildWindows
不会按照您想要的顺序给您 windows。您必须向每个 window 询问其位置,然后根据这些位置自行订购 windows。
您需要决定使用什么顺序。从上到下,然后从左到右。或者从左到右,然后到底部。或者也许是其他命令。
您可以使用 GetWindowRect
获取每个 window 的边界矩形。
EnumChildWindows 通过将句柄传递给每个子 window 来枚举属于指定父 window 的子 windows,它们是基于 windows Z 枚举的订单。
为所有 windows 设置正确的 Z 顺序将解决您的问题