我有給定窗口的句柄。我如何枚舉它的子窗口?如何根據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. 如何獲得由ShellExecuteEx打開的窗口的hWnd .. hProcess?
- 2. 如何獲得無窗口ATL控件的HWND?
- 3. 如何父窗口的子窗口
- 4. 如何獲得最小化窗口的窗口句柄
- 5. 獲得從窗口
- 6. 從Win32 DLL獲得HWND後,能否獲得本地窗口的座標(即使窗口移動)
- 7. 如何知道窗口是子窗口還是父窗口?
- 8. 如何知道子窗口父窗口銷燬窗口
- 9. 在VB6中獲取當前窗口/窗體的hWnd?
- 10. 父窗口和子窗口
- 11. 如何從extjs的子窗口tp父窗口返回數據?
- 12. 如何從具有特定HWND的窗口中獲取文本?
- 13. 根據記錄ID限制子窗口
- 14. 如何獲得UAC窗口的屏幕?
- 15. 如何獲得HTA窗口的大小?
- 16. 如何獲得分機窗口的ID
- 17. 使Toplevel窗口跟隨根Tk窗口
- 18. 得到新建窗口的「父」窗口
- 19. Flex NumberFormatter根據窗口
- 20. VB.NET - 如何獲得在即時窗口
- 21. QT - 帶子窗口的模態窗口
- 22. 獲得一個窗口
- 23. C#獲得焦點窗口?
- 24. Win32窗口中的OpenGL圖元根據窗口大小扭曲
- 25. 子窗口彈出窗口的父窗口可見性
- 26. 將PHP窗體數據從子窗口傳遞到父窗口
- 27. 如何根據我現有的窗口創建一個新的C#窗口?
- 28. 在JPanel中嵌入HWND(窗口句柄)
- 29. 如何在父窗口關閉時從子窗口訪問父窗口方法?
- 30. 使用子窗口關閉父窗口。
一般。我可以獲得我想列舉的窗口的HWND。 – 2009-09-01 16:12:02
非常好 - 我已經更新了您的問題,以便清楚說明。 – Shog9 2009-09-01 16:25:30
假設你瞭解spy ++。使用這些東西的有用工具。 – David 2009-09-01 17:21:11