正常に動作するかは確認していません。
また、再帰を使用しているので深さが512付近になると落ちます。
そこまで深くネストした親子関係はないと思いますが。
正常に動作するかは確認していません。
また、再帰を使用しているので深さが512付近になると落ちます。
そこまで深くネストした親子関係はないと思いますが。
#module ED
#uselib "User32.dll"
#cfunc ED_GetWindow "GetWindow" int, int
// EnumDescendants handle, result
// handleのウィンドウハンドルを持つウィンドウの子孫を列挙し、ウィンドウハンドルを配列でresultに代入します
// resultは予め0で初期化(dim result を実行)してください
#deffunc EnumDescendants int handle, array result, local child, local flag
// 最初の子ウィンドウを取得
child = ED_GetWindow(handle, 5/*GW_CHILD*/)
// 子ウィンドウが存在する限りループ
while child
// 既にresultにあるものは除く(このような場合が存在するのか分からないが、念のため)
// 万が一巡回参照があった場合、この作業を行わないと無限ループに陥る
flag = 1
foreach result
if result(cnt) == child {
// 初出ではないウィンドウの模様
flag = 0
break
}
loop
if flag {
// どうやら初出のウィンドウらしいので、resultに追加
if result(0) {
// 末尾に追加
result(length(result)) = child
} else {
// 最初の代入なので、添字0に代入
result(0) = child
}
// 再帰
EnumDescendants child, result
}
// 次の子ウィンドウを取得
child = ED_GetWindow(child, 2/*GW_HWNDNEXT*/)
wend
return
#global