正常に動作するかは確認していません。
また、再帰を使用しているので深さが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