C# Windows API 根据句柄遍历子控件句柄
时间: 2024-04-30 13:24:26 浏览: 109
遍历子窗口函数 得到控件句柄、CEdit CListView CComboBox
4星 · 用户满意度95%
在C#中,可以使用Windows API函数来遍历一个窗口的子控件句柄。以下是一个示例代码:
```csharp
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lclassName, string windowTitle);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
// 遍历子控件句柄
public static List<IntPtr> GetChildHandles(IntPtr parentHandle)
{
List<IntPtr> result = new List<IntPtr>();
IntPtr childHandle = IntPtr.Zero;
while ((childHandle = FindWindowEx(parentHandle, childHandle, null, null)) != IntPtr.Zero)
{
result.Add(childHandle);
result.AddRange(GetChildHandles(childHandle));
}
return result;
}
```
在上面的示例代码中,`FindWindowEx`函数用于查找一个窗口的子控件,`GetWindow`函数用于获取一个窗口的子控件,`SendMessage`函数用于向一个窗口发送消息。
使用示例:
```csharp
// 获取窗口句柄
IntPtr hWnd = Process.GetProcessesByName("notepad").FirstOrDefault()?.MainWindowHandle;
if (hWnd != IntPtr.Zero)
{
// 获取子控件句柄
List<IntPtr> childHandles = GetChildHandles(hWnd);
foreach (IntPtr childHandle in childHandles)
{
// 处理每个子控件
// ...
}
}
```
阅读全文