ハンドル取得系 Function

getMousePosWindowEx(def_cmode = 1) ※※
マウス下Windowのハンドル返す(MDIアプリ上の 子ウィンドウ対応)
GetMdiChildWindowList(hParent) ※
指定ウィンドウ内の MDI子ウィンドウハンドルを列挙
GetChildhWndList(hParent) ※
指定ハンドルの コントロール子ハンドルを列挙(1階層のみ)
GetClassName(hWnd)
指定コントロールハンドルの(正確な)クラス名を返す

9/6に改あり
※※ 9/16修正

単品API(コピペ用)

    ;親ウィンドウハンドルを取得
    hwhd := DllCall("GetParent",UInt,hWnd, UInt)

    ;座標値のコントロールのハンドル取得
    hwhd := DllCall("WindowFromPoint", Int,x, Int,y, UInt)

    ;指定されたウィンドウに関する情報を取得します。
    ; 第ニパラメータ
    ; GWL_STYLE   = -16  ウィンドウスタイル 
    ; GWL_EXSTYLE = -20  拡張ウィンドウスタイル 
    result := Dllcall("GetWindowLong", Uint,hWnd, Int,nIndex, Int)

マウス下Windowのハンドル返す

;-----------------------------------------------------------------
;  マウス下Windowのハンドル返す(MDIアプリ上の 子ウィンドウ対応)
;       対象: AHK v1.0.34以降
;   in  def_cmode   元のマウスモード 1:Relative(デフォルト) 0:Screen
;   戻り値 : Window ID (0:該当無し)
;-----------------------------------------------------------------
getMousePosWindowEx(def_cmode = 1)
{
    CoordMode,Mouse,Screen
    MouseGetPos, mx,my

    ;--- タイトルバーを持つウィンドウを探して返す ---
    ;マウス座標値直下のコントロールハンドル取得
    hWnd := DllCall("WindowFromPoint",Int,mx, Int,my, UInt)
    Loop
    {
        ;指定ハンドルのコントロールはタイトルバーもちウィンドウか?
        ;※ メニュー系ポップアップウィンドウは対象外
        ; 2005.09.16 Excel2000対応
        WinGet,ExStyle,ExStyle,ahk_id %hWnd%
        if (ExStyle & 0x100 = 0x100)                ;WS_EX_WINDOWEDGE
        {
            WinGet,Style,Style,ahk_id %hWnd%
            if (Style & 0x00C00000 = 0x00C00000)     ;WS_CAPTION
            Break
        }
        ;違うなら 1階層上のコントロールを検索
        hWnd := DllCall("GetParent",UInt,hWnd, UInt) ;親ウィンドウ検索
        ifEqual,hWnd,0,  Break                  ;Error
    }

    ;--- マウスの座標モードを戻しとく ---
    ;(組込み変数で CoordMode,Mouseの状態が取れないので苦肉の策)
    ifEqual def_cmode,1,    CoordMode,Mouse,Relative
    return hWnd
}

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

;----------------------------------------------------------
;  指定ウィンドウ内の MDI子ウィンドウハンドルを列挙
;       対象: AHK v1.0.34以降
;   in  hParent :親ウィンドウハンドル
;   戻り値:ハンドルリスト (改行区切り)
;----------------------------------------------------------
GetMdiChildWindowList(hParent)
{
    ;--- 親ウィンドウの第一階層から MDIクライアントを検索 ---
    hWnd := DllCall("GetWindow", Uint,hParent, Int,5, Uint)
    ifEqual,hWnd,0,     return
    Loop
    {
        ;Class名に MDIがあったら MDIクライアントと見なす
        WinGetClass,class, ahk_id %hWnd%
        ifInstring, class, MDI
            break

        ;同階層にある次の子ハンドル検索
        hWnd := DllCall("GetWindow", Uint,hWnd, Int,2, Uint)
        ifEqual hWnd,0, return
    }

    ;--- MDIクライアント下のコントロールからMDI子ウィンドウ属性のもの抽出 ---
    hWnd := DllCall("GetWindow", Uint,hWnd, Int,5, Uint)
    ifEqual,hWnd,0,     return
    Loop
    {
        ;MDI子ウィンドウ属性か?
        WinGet,exs,Exstyle,ahk_id %hWnd%
        if (exs & 0x00000040 = 0x00000040)    ;WS_EX_MDICHILD
            clist = %clist%`n%hWnd%

        ;同階層にある次の子ハンドル検索
        hWnd := DllCall("GetWindow", Uint,hWnd, Int,2, Uint)
        ifEqual hWnd,0, break
    }
    StringTrimLeft,clist,clist,1    ;最初の改行を除去
    return clist
}

指定ハンドルの コントロール子ハンドルを列挙(1階層のみ)

;-----------------------------------------------------
;  指定ハンドルの コントロール子ハンドルを列挙(1階層のみ)
;       対象: AHK v1.0.34以降
;   in  hParent :親ウィンドウハンドル
;   戻り値:ハンドルリスト (改行区切り)
;-----------------------------------------------------
GetChildhWndList(hParent)
{
    ;Public Declare Function GetWindow Lib "USER32"
    ; (ByVal hWnd As Long, ByVal wCmd As Long) As Long

    ;--- 第2パラメータ ---
    ; GW_hWndLAST  = 1    同、Zオーダーのラストに位置するウィンドウのハンドル
    ; GW_hWndNEXT  = 2    hWndで指定したウィンドウの次のウィンドウのハンドル
    ; GW_hWndPREV  = 3    同、前にあるウィンドウのハンドルを取得
    ; GW_OWNER     = 4    ウィンドウのオーナーウィンドウのハンドル

    ;最初の子ハンドルを検索
    hWnd := DllCall("GetWindow", Uint,hParent, Int,5, Uint)
    ifEqual,hWnd,0,     return
    hWndList := hWnd

    ;同階層にある子ハンドルを列挙
    Loop
    {
        hWnd := DllCall("GetWindow", Uint,hWnd, Int,2, Uint)
        ifEqual hWnd,0, break
        hWndList = %hWndList%`n%hWnd%
    }
    return hWndList
}

指定コントロールハンドルの(正確な)クラス名を返す

;-----------------------------------------------------------------
;   指定コントロールハンドルの(正確な)クラス名を返す
;       対象: AHK v1.0.34以降
;   in  hWnd    ハンドル名
;   戻り値      Class名
;-----------------------------------------------------------------
GetClassName(hWnd)
{
   ; AHKコマンド(ControlGet等)ではAHK用に後ろに連番が付いてしまい
   ; 正確なClass名が得られないため
   ; (ただ hWndが判明していれば WinGetClassで子供のClass名も得られるので意味ないかも)
   ; 2005.08.31 WinGetClassで取得できないものもあるのでやっぱり有効かも

    max:=VarSetCapacity(s,256)
    DllCall("GetClassName", Int,hWnd, Str,s, Int,max, Int)
    return s
}