子孫ウィンドウを列挙する

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