正常に動作するかは確認していません。
また、再帰を使用しているので深さが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 = 1foreach resultif result(cnt) == child {// 初出ではないウィンドウの模様flag = 0break}loopif flag {// どうやら初出のウィンドウらしいので、resultに追加if result(0) {// 末尾に追加result(length(result)) = child} else {// 最初の代入なので、添字0に代入result(0) = child}// 再帰EnumDescendants child, result}// 次の子ウィンドウを取得child = ED_GetWindow(child, 2/*GW_HWNDNEXT*/)wendreturn#global