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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0204
こいる外部アプリの子ウィンドウの中にあるオブジェクトを操作したい4解決


こいる

リンク

2020/2/4(Tue) 17:12:31|NO.89413

現在、とある外部アプリを操作するものを作っており、
そのアプリの子ウィンドウの中にあるオブジェクト(ListBox,Buttonなど)を操作したいです。

aplselとaplobjでやればいい話なのですが、
2重起動などでウィンドウが2つ以上あった場合に、
キー送信などが正常に行えるのか心配なので、確実に操作できる方法を取りたいです。

操作する親ウィンドウの、ウィンドウハンドルとクラス名は取得済みで、分かっている(分かる)状態です。


ここから質問です。

子ウィンドウの捕獲にはWin32APIである「FindWindowEx」関数を使えばいいのでしょうが、
オブジェクトを捕獲する(ウィンドウハンドルを取得する?)にはどうすればいいのでしょうか?

また、ListBoxの操作をメインにすると思うのですが、
捕獲したListBoxの 選択している項目の取得や、項目数の取得、
項目の選択、キー送信をするには、どうすればいいですか?



この記事に返信する


あらや

リンク

2020/2/4(Tue) 19:32:07|NO.89414

少々あやしい内容になりそうなのでヒントだけ……

オブジェクトも子ウィンドウの一種です。

オブジェクトのウィンドウハンドルが分かればsendmsgで操作が可能です。

リストボックスに対するメッセージは
LB_〜系の物を調べると色々出て来ると思います。



こいる

リンク

2020/2/4(Tue) 20:18:44|NO.89415

返信ありがとうございます。


>オブジェクトも子ウィンドウの一種です。

そうだったのですか。


>リストボックスに対するメッセージは
>LB_〜系の物を調べると色々出て来ると思います。

ありました。
https://msdn.microsoft.com/en-us/library/cc656499.aspx


では、オブジェクトを捕獲しようとクラス名を調べると、
リストボックスは「Listbox」、ボタンは「Button」となっていたのですが、

複数のオブジェクト(ListBox)を捕獲したい場合、
全部同じクラス名(Listbox)なので、できないと思うのですが、どうすればいいですか?



あらや

リンク

2020/2/4(Tue) 21:06:54|NO.89416

複数のオブジェクトならば、
FindWindowExで2番目の子ウィンドウのハンドルを入れる箇所に
最初は0を入れてとりあえず1つハンドルを取得。

次は再度FindWindowExを使い最初に取得したハンドルを入れて、
ほかのハンドルを取得……

これをrepeatでFindWindowExの戻り値が0になるまで繰り返せば
クラス名が同じでも全てのハンドルが取得できます。



コールバック関数を使うなら(modclbk3.hspをインクルード)
EnumChildWindowsを利用する方法もありますが、
クラス名が同じならFindWindowExの方が手っ取り早く出来ると思います。



こいる

リンク

2020/2/12(Wed) 20:22:47|NO.89479

すみません。返信が遅くなりました。

おっしゃる通り、FindWindowExを使うとできました!

サンプルを作ってみたので置いておきます。


// Buttonだけを検出するサンプル #uselib "user32.dll" #func FindWindowEx "FindWindowExA" sptr,sptr,sptr,sptr #cfunc FindWindow "FindWindowA" sptr,sptr #func GetClassName "GetClassNameA" int,var,int #func GetWindowText "GetWindowTextA" int, var, int // ウィンドウ初期化 screen 0,640,480,0, ginfo_dispx/2-320, ginfo_dispy/2-240 title "Buttonだけを検出する" // 取得する対象のウィンドウを作成 screen 1,360,200,0, 0, 0 title "Buttonだけを検出する(対象)" objsize ginfo_winx,23 dim a sdim b,256 button "ボタン1",*lab mesbox b button "ボタン2",*lab listbox a,0,"a" button "ボタン3",*lab *lab gsel 0 ;メインウィンドウに操作先を戻す // mesbox設置 font "MSゴシック",16 objmode 2 sdim mainMes,5000 mesbox mainMes,ginfo_winx,ginfo_winy,4 notesel mainMes // 親ウィンドウのハンドル取得 wh = FindWindow(0,"Buttonだけを検出する(対象)") // noteadd "親hwnd : "+str(wh)+"\n" // メイン sdim class,256 // クラス名 sdim wt,256 // タイトル sdim buf,256 // 汎用 dim count // 検出数カウンタ repeat if cnt==0{ ; 初回は0 FindWindowEx wh,0,"Button",0 }else{ ; 以降は戻り値 FindWindowEx wh,retWh,"Button",0 } retWh = stat if retWh{ GetClassName retWh,class,256 // クラス名取得 if count<=9{ buf = "00"+str(count) }else:if count<=99{ buf = "00"+str(count) }else{ buf = ""+str(count) } GetWindowText retWh,wt,256 // タイトル取得 noteadd buf+".Class : "+str(class) // クラス名追加 noteadd " "+"hwnd : "+retWh // ハンドル追加 noteadd " "+"title : "+wt // タイトル追加 noteadd "" count++ }else{ // 戻り値が0なら終了 break } loop // 検出数情報追加 noteadd "検出数 : "+str(count),1 // mesbox更新 objprm 0,mainMes

ありがとうございました!



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