ハンドル取得系 Function 改

8/27日に張った奴は FindWindowExでのチャイルドウィンドウ検索の方法がわからず GetWindowを使ってるのだが、流行らせるページ投稿スレに過去自分が作ったものがあったよ orz
しかも質問スレで FindWindowExのパラメータ渡しの方法を教えてもらっていたのに完全に忘れてた


というわけで 投稿スレの FindWindowEx使用バージョンも貼っとこう。

  • メモリリークがイヤンな感じなので 再帰呼出し使わないよう修正。
  • あと職場で試してみたらEXCEL(2000)の子ウィンドウが検知できなかったのでそれも対応してみた。
  • 戻り値最初の1バイト目に不要な改行が入ってしまってたのを修正(9/16)
  • MDIのアクティブ子ウィンドウだけ欲しい場合があったのでついでにオプション追加(9/16)
  • Excel子ウィンドウ判定にWS_VISIBLEのチェックを追加(11/21)
GetMdiChildWindowList(hParent, ExFlg=0, OnlyTopWindow=0)
指定ウィンドウ内の MDI子ウィンドウハンドルを列挙 ※1
GetChildhWndList(hParent,ChildCheck=0)
指定ハンドルの コントロール子ハンドルを列挙 ※1 ※2

※1 9/16修正
※2 11/21修正

指定ウィンドウ内の MDI子ウィンドウハンドルを列挙

GetMdiChildWindowList(hParent, ExFlg=0, OnlyTopWindow=0)
;----------------------------------------------------
;  指定ウィンドウ内の MDI子ウィンドウハンドルを列挙
;       対象: AHK v1.0.34以降
;   in  hParent         親ウィンドウハンドル
;       ExFlg           1:拡張チェックON 0:OFF
;       OnlyTopWindow   1:トップ子ウィンドウのみ取得(2005.09.16)
;   戻り値:ハンドルリスト (改行区切り)
;----------------------------------------------------
{
    ;指定ウィンドウ内のコントロール属性を最下層まで全部チェック
    chklist = %hParent%,0`n
    Loop
    {
        StringLeft,dat,chklist,% instr(chklist,"`n")-1
        StringReplace,chklist,chklist,%dat%`n,

        stringSplit,hWnd,dat,`,
        chwnd := DllCall("FindWindowEx",UInt,hWnd1, Uint,hwnd2, Int,0, Int,0)
        if (chwnd <> 0)
        {
            ;--- MDI CHILD属性チェック ---
            WinGet,ExStyle,ExStyle,ahk_id %chwnd%
            if (ExStyle & 0x40 = 0x40)          ;WS_EX_MDICHILD
                chWndlist = %chWndlist%`n%chwnd%

            ;--- 拡張チェック (EXCEL2000対応用) ---
            ;MDI属性じゃなくても窓っぽかったら子ウィンドウとみなす
            else if (Exflg) && (ExStyle & 0x100 = 0x100)   ;WS_EX_WINDOWEDGE
            {
                WinGet,Style,Style,ahk_id %chwnd%
                ; 2005.11.21 可視ウィンドウフラグもチェック
                if (Style & 0x10C00000 = 0x10C00000)    ;WS_VISIBLE & WS_CAPTION
                    chWndlist = %chWndlist%`n%chwnd%
            }
            ;--- トップ(アクティブ)子ウィンドウのみでいい場合 2005.09.16 ---
            if (OnlyTopWindow) && (chWndlist != "")
                break
            ;--- チェックリスト追加:同階層の次 & 下位 ---
            chklist = %hwnd1%`,%chwnd%`n%chklist%   ;同階層の次のウィンドウ
            chklist = %chwnd%`,0`n%chklist%         ;下位層
        }
        ifEqual chklist,,   break
    }
    StringTrimLeft,chWndlist,chWndlist,1    ;2005.09.16 変数名間違い修正
    return chWndlist
}

指定ハンドルの コントロール子ハンドルを列挙

GetChildhWndList(hParent,ChildCheck=0)
;--------------------------------------------------------------------
;  指定ハンドルの コントロール子ハンドルを列挙
;       対象: AHK v1.0.34以降
;   in  hParent    親ウィンドウハンドル
;       ChildCheck 1:孫以下の階層のコントロールも列挙する
;   戻り値:ハンドルリスト (改行区切り)
;--------------------------------------------------------------------
{
    ;指定ウィンドウ内のコントロール属性をチェック
    chklist = %hParent%,0`n
    Loop
    {
        StringLeft,dat,chklist,% instr(chklist,"`n")-1
        StringReplace,chklist,chklist,%dat%`n,

        stringSplit,hWnd,dat,`,
        chwnd := DllCall("FindWindowEx",UInt,hWnd1, Uint,hwnd2, Int,0, Int,0)
        if (chwnd <> 0)
        {
            chWndlist = %chWndlist%`n%chwnd%

            ;--- チェックリスト追加:同階層の次 & 下位 ---
            chklist = %hwnd1%`,%chwnd%`n%chklist%   ;同階層の次のウィンドウ
            if (ChildCheck)
                chklist = %chwnd%`,0`n%chklist%     ;下位層
        }
        ifEqual chklist,,   break
    }
    StringTrimLeft,chWndlist,chWndlist,1    ;2005.09.16 変数名間違い修正
    return chWndlist
}