|
|
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は取得できてるのが前提です。
|
|
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:30:08|NO.66544
ちなみにプロセスBの親ウィンドウのタイトル名は分かっている場合を前提でも大丈夫です。
分からない場合でも大丈夫です。
|
|
2014/12/23(Tue) 10:03:41|NO.66547
コールバックですがEnumChildWindows関数を使って
ほぼすべての子ウインドウを列挙できます。親ウィンドウのハンドルが分かる場合ですが
|
|
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
|
|
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様
ありがとうございます。
二つとも比べて勉強します。
そして、解決しました。
ありがとうございます^^
|
|