ハンドル取得系 Function
※ 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 }