HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1222
可憐親ウィンドウから子ウィンドウを全て取得する方法8解決


可憐

リンク

2014/12/22(Mon) 23:34:35|NO.66538

親ウィンドウから子ウィンドウを全て取得する方法を教えてほしいです。
EnumChildWindowsで取得するというのが分かりましたが
組み方がわかりません。


#uselib "user32.dll" #func FindWindow "FindWindowA" int,str #func ShowWindow "ShowWindow" int,int #func keybd_event "keybd_event" int, int, int,int #func mouse_event "mouse_event" int, int, int,int,int #func EnumChildWindows "EnumChildWindows",int,int,int title "HSP3!" FindWindow NULL, "HSP3!" : linewnd=stat mes linewnd screen 1 title "aiu";←ここは分からない事を前提です。

素材が少ないですが、お願いしますm(_ _)m



この記事に返信する


可憐

リンク

2014/12/22(Mon) 23:52:13|NO.66539

上のソースは自分のウィンドウハンドルを取得するようになってますが
自分以外のプロセスのウィンドウハンドル及び子ウィンドウを取得したいです。
親ウィンドウのhwndは取得できてるのが前提です。



fortunehill

リンク

2014/12/23(Tue) 01:06:32|NO.66541

/*ご参考(此れで良いのかしら)*/

#uselib "user32" #func global FindWindowExA "FindWindowExA" sptr,sptr,sptr,sptr repeat 3 :button str(cnt),*label pos 80,ginfo_cy-18 mes objinfo(cnt,2) pos 0 loop mes repeat :FindWindowExA hwnd,ii,0,0 :ii = stat :if (ii == 0) {break} mes ii loop stop *label



可憐

リンク

2014/12/23(Tue) 01:19:27|NO.66542

すみません。
私の日本語というか説明がおかしかったようで

http://gyazo.com/fd789fef4dc32b26a4dc982914be515f

このような感じで
プロセスAがあったとして
プロセスBが4つの窓を持ってたとします。

プロセスBの4つの窓のウィンドウハンドルを取得したいです。
説明が下手で申し訳ございません。。



可憐

リンク

2014/12/23(Tue) 01:30:08|NO.66544

ちなみにプロセスBの親ウィンドウのタイトル名は分かっている場合を前提でも大丈夫です。
分からない場合でも大丈夫です。



skyblue

リンク

2014/12/23(Tue) 10:03:41|NO.66547

コールバックですがEnumChildWindows関数を使って
ほぼすべての子ウインドウを列挙できます。親ウィンドウのハンドルが分かる場合ですが



tds12

リンク

2014/12/23(Tue) 11:45:23|NO.66549

モジュールを作ってみました。
自由に使って良いことを明示します。
このモジュールを使うためには"modclbk"が必要です。
modclbkはhttp://dev.onionsoft.net/seed/info.ax?id=838からダウンロードできます。


//--------------------------------------------------------------------- //↓インクルード // http://dev.onionsoft.net/seed/info.ax?id=838 #include "mod_clbk2.hsp" //↓モジュール #module #uselib "user32.dll" #func EnumChildWindows "EnumChildWindows" int,int,int #deffunc getchildwindows int targetwnd,array arr dim arr dim clbkptr,1 dim i,1 sdim tmpwns,64 sdim wns ewlb=*ew newmod clbk,modclbk,clbkptr,2,ewlb EnumChildWindows targetwnd,clbkptr,0 return *ew dupptr winh,lparam,wparam*4,4 arr(i) = winh(0) i++ return 1 #global //-------------------------------------------------------------------- //↓サンプル getchildwindows 0,arr //↑getchildwindows // 一つ目の引数には親のウィンドウハンドル // 2つ目の引数には小ウィンドウハンドルを受け取るための配列 // を指定する。 foreach arr //↓ウィンドウハンドルを表示する mes arr(cnt) loop stop



fortunehill

リンク

2014/12/23(Tue) 15:21:52|NO.66550

/*ご参考2*/

#uselib "user32" #func global FindWindowExA "FindWindowExA" sptr,sptr,sptr,sptr #func global GetClassNameA "GetClassNameA" sptr,sptr,sptr #func global GetWindowLongA "GetWindowLongA" sptr,sptr #func global SetParent "SetParent" sptr,sptr repeat 4 :screen cnt+1,160,120,4 :hh(cnt+1) = hwnd :mes strf("ID= %d hwnd= %d",cnt+1,hwnd) :loop gsel 0,1 :SetParent hh(1),hwnd ;screen1 の親を screen0 に設定してみる。 sdim ss,512 repeat :FindWindowExA 0,ii,0,0 ;top 下のウインドウの列挙 ;FindWindowExA hwnd,ii,0,0 ;hwnd 下のウインドウ(オブジェクト)の列挙 :ii = stat :if (ii == 0) {break} :GetClassNameA ii,varptr(ss),512 ;クラス名で抽出 ↓USERDATA から ID を取得 :if (ss == "hspwnd0") {GetWindowLongA ii,-21 :mes strf("ID= %d hwnd= %d",stat,ii)} loop



可憐

リンク

2014/12/23(Tue) 23:05:30|NO.66568

tds12様
fortunehill様
ありがとうございます。
二つとも比べて勉強します。
そして、解決しました。
ありがとうございます^^



ONION software Copyright 1997-2023(c) All rights reserved.