EnumChildWindows
是 C# 中的一個方法,用于枚舉一個窗口的所有子窗口。以下是一些使用技巧:
EnumChildWindows
時,需要傳遞一個回調函數作為參數。這個回調函數將被枚舉到的每個子窗口調用。在回調函數中,可以對每個子窗口執行操作,例如獲取窗口句柄、標題等。[DllImport("user32.dll")]
public static extern bool EnumChildWindows(IntPtr hWnd, EnumWindowProc lpEnumFunc);
public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr lParam);
IntPtr
參數來存儲額外的信息。例如,可以將窗口句柄傳遞給回調函數,并在需要時將其轉換回原始類型。public static bool EnumChildWindowsWithHandle(IntPtr parentHwnd, EnumWindowProc lpEnumFunc)
{
return EnumChildWindows(parentHwnd, (hWnd, lParam) =>
{
IntPtr handle = new IntPtr(hWnd);
// 對每個子窗口執行操作,例如獲取標題
string title = GetWindowText(handle);
Console.WriteLine($"子窗口句柄: {handle}, 標題: {title}");
// 返回 true 以繼續枚舉
return true;
});
}
EnumChildWindows
時,需要注意窗口可能已經關閉或被銷毀的情況。在這種情況下,回調函數可能會收到一個無效的窗口句柄。為了避免程序崩潰,可以在回調函數中檢查窗口句柄是否有效。public static bool EnumChildWindowsWithHandle(IntPtr parentHwnd, EnumWindowProc lpEnumFunc)
{
return EnumChildWindows(parentHwnd, (hWnd, lParam) =>
{
IntPtr handle = new IntPtr(hWnd);
if (handle == IntPtr.Zero)
{
return true; // 忽略無效的窗口句柄
}
// 對每個子窗口執行操作,例如獲取標題
string title = GetWindowText(handle);
Console.WriteLine($"子窗口句柄: {handle}, 標題: {title}");
// 返回 true 以繼續枚舉
return true;
});
}
public static bool EnumChildWindowsWithFilter(IntPtr parentHwnd, string className, string text, EnumWindowProc lpEnumFunc)
{
return EnumChildWindows(parentHwnd, (hWnd, lParam) =>
{
IntPtr handle = new IntPtr(hWnd);
if (handle == IntPtr.Zero)
{
return true; // 忽略無效的窗口句柄
}
// 獲取窗口類名和文本
string class名 = GetClassName(handle);
string windowText = GetWindowText(handle);
// 檢查窗口是否匹配過濾條件
if (class名 == className && windowText.Contains(text))
{
// 對匹配的子窗口執行操作
Console.WriteLine($"找到匹配的子窗口: {handle}, 類名: {class名}, 文本: {windowText}");
}
// 返回 true 以繼續枚舉
return true;
});
}
通過這些技巧,可以更有效地使用 EnumChildWindows
方法來枚舉和處理子窗口。