我有给定窗口的句柄。我如何枚举它的子窗口?如何根据HWND获得窗口的子窗口?
回答
我发现最好的解决方案是Managed WindowsAPI。它有一个CrossHair控件,可以用来选择一个窗口(不是问题的一部分),还有一个方法AllChildWindows来获取所有可能封装了EnumChildWindows函数的子窗口。最好不要重新发明轮子。
使用:
internal delegate int WindowEnumProc(IntPtr hwnd, IntPtr lparam);
[DllImport("user32.dll")]
internal static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc func, IntPtr lParam);
你会得到你在
使用EnumChildWindows传递函数回调,与P /调用。这里有一些有关它的一些行为的有趣链接:https://blogs.msdn.microsoft.com/oldnewthing/20070116-04/?p=28393
如果你不知道窗口的句柄,但只有它的标题,你需要使用EnumWindows。 http://pinvoke.net/default.aspx/user32/EnumWindows.html
这是EnumWindows的一个托管替代方法,但您仍然需要使用EnumChildWindows来查找子窗口的句柄。
foreach (Process process in Process.GetProcesses())
{
if (process.MainWindowTitle == "Title to find")
{
IntPtr handle = process.MainWindowHandle;
// Use EnumChildWindows on handle ...
}
}
我正在尝试这样做,但没有主要窗口。 – Epu 2011-10-07 14:47:14
Epu,如果没有主窗口,那么进程将不会有窗口句柄来获取(即Process.MainWindowHandle == IntPtr.Zero)。 – 2011-10-07 21:31:03
Here你有一个有效的解决方案:
public class WindowHandleInfo
{
private delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);
[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);
private IntPtr _MainHandle;
public WindowHandleInfo(IntPtr handle)
{
this._MainHandle = handle;
}
public List<IntPtr> GetAllChildHandles()
{
List<IntPtr> childHandles = new List<IntPtr>();
GCHandle gcChildhandlesList = GCHandle.Alloc(childHandles);
IntPtr pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList);
try
{
EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
EnumChildWindows(this._MainHandle, childProc, pointerChildHandlesList);
}
finally
{
gcChildhandlesList.Free();
}
return childHandles;
}
private bool EnumWindow(IntPtr hWnd, IntPtr lParam)
{
GCHandle gcChildhandlesList = GCHandle.FromIntPtr(lParam);
if (gcChildhandlesList == null || gcChildhandlesList.Target == null)
{
return false;
}
List<IntPtr> childHandles = gcChildhandlesList.Target as List<IntPtr>;
childHandles.Add(hWnd);
return true;
}
}
如何使用它:
class Program
{
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
static void Main(string[] args)
{
Process[] anotherApps = Process.GetProcessesByName("AnotherApp");
if (anotherApps.Length == 0) return;
if (anotherApps[0] != null)
{
var allChildWindows = new WindowHandleInfo(anotherApps[0].MainWindowHandle).GetAllChildHandles();
}
}
}
- 1. JACOB获取窗口的HWND
- 2. 如何通过HWND获取窗口类?
- 3. 如何获得由ShellExecuteEx打开的窗口的hWnd .. hProcess?
- 4. 如何获得无窗口ATL控件的HWND?
- 5. 如何获得一个或多个隐藏窗口的HWND?
- 6. 如何从子窗口获取GUI主窗口中的数据?
- 7. PAMIE:获取IE窗口的hwnd
- 8. 获取每个窗口的HWND?
- 9. 如何父窗口的子窗口
- 10. 如何获得最小化窗口的窗口句柄
- 11. 如何获得白色库中窗口的窗口ID
- 12. 从Win32 DLL获得HWND后,能否获得本地窗口的坐标(即使窗口移动)
- 13. 获得从窗口
- 14. 如何根据QProcess将窗口设置为活动窗口?
- 15. 如何知道子窗口父窗口销毁窗口
- 16. 如何知道窗口是子窗口还是父窗口?
- 17. 如何在子窗口中获取父窗口标签的html?
- 18. 在VB6中获取当前窗口/窗体的hWnd?
- 19. C# - 如何关闭当前窗口,并获得新窗口
- 20. 获取窗口hwnd如果所有者hwnd,窗口的名称和大小已知
- 21. Silverlight子窗口父窗口
- 22. 父窗口和子窗口
- 23. 如何从extjs的子窗口tp父窗口返回数据?
- 24. 如何在子窗口中使用主窗口中的数据?
- 25. 如何获得子窗口通过点击按钮将窗口焦点(IE)
- 26. 如何使用javascript从父窗口获取子窗口url
- 27. 如何从具有特定HWND的窗口中获取文本?
- 28. 如何在另一窗口中获取Combobox的HWND?
- 29. 根据记录ID限制子窗口
- 30. 如何获得CREATESTRUCT的一个窗口?
一般。我可以获得我想列举的窗口的HWND。 – 2009-09-01 16:12:02
非常好 - 我已经更新了您的问题,以便清楚说明。 – Shog9 2009-09-01 16:25:30
假设你了解spy ++。使用这些东西的有用工具。 – David 2009-09-01 17:21:11