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