GUIソフト上のボタンを検出する方法 – プログラミング – Home

GUIソフト上のボタンを検出する方法
 
通知
すべてクリア

[解決済] GUIソフト上のボタンを検出する方法


みず
 みず
(@みず)
ゲスト
結合: 19年前
投稿: 8
Topic starter  

地図ソフト上のあるボタンをクリックしたいのですがボタンのハンドルを検出する方法
を教えてください。よろしくお願いします。

環境:Windows XP, VC6

Spy++で検出した地図ソフトの構造の一部です。

0036051C 地図帳 Afx:400000:b:100100:6:3a4062d
014905C2 " AfxWnd42
009D061A " AfxWnd42 ←ボタンのグループ, ここのボタンを押したい

下記をトライしましたが取得できませんでした。
HWND Wnd, Wnd1; //ウィンドウハンドル取得用変数
 Wnd = FindWindow(NULL, 地図帳);
SetForegroundWindow(Wnd);  //地図帳にフォーカスする。
 Wnd1 = FindWindow(AfxWnd42, NULL);


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

とりあえず、
> FindWindow
ではトップレベルのウィンドウしか取得できません。

FindWindowExは親ウィンドウを指定して探せるのでそちらを使ってみるとか、
EnumChildWindowsで子ウィンドウを列挙してみるとか。
(クラス名が明確ならばFindWindowExが楽でしょう)


返信引用
みず
 みず
(@みず)
ゲスト
結合: 19年前
投稿: 8
Topic starter  

Blueさま、

有難うございます。
FindWindowExを使って目的のハンドルを取れました。
ここで知っていたら教えて欲しいのですが、ボタンIDを取得する場合、
どの様なAPIを使うのでしょうか?
GetMenuでよいのでしょうか。

ソフトのレイアウトとしては、タイトル枠の下に幾つかのアイコン状のボタンが
並んでいます。

よろしくお願いいたします。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> ボタンIDを取得する場合
GetDlgCtrlIDです。


返信引用
みず
 みず
(@みず)
ゲスト
結合: 19年前
投稿: 8
Topic starter  

> GetDlgCtrlIDです。
目的のボタンのグループに行き、IDを取得、クリックしてみましたがうまく行きませ
んでした。考え方が間違っているでしょうか。

詳しく調べてみました↓
0036051C 地図帳 Afx:400000:b:100100:6:3a4062d
-014905C2 " AfxWnd42
-009D061A " AfxWnd42
-01490602 " AfxWnd42 ←ボタンのグループ, ここのボタンを押したい

コントロールの部分です。
SetForegroundWindow(Wnd3); //ボタンのグループをアクティブにする
Sleep(200);
wParam = GetDlgCtrlID(Wnd3);

SendMessage(Wnd4, WM_LBUTTONDOWN, wParam, 0);
SendMessage(Wnd4, WM_LBUTTONDOWN, wParam, 0);
SendMessage(Wnd4, WM_LBUTTONUP, wParam, 0);
SendMessage(Wnd4, WM_LBUTTONUP, wParam, 0);


返信引用
みず
 みず
(@みず)
ゲスト
結合: 19年前
投稿: 8
Topic starter  

すみません、情報が間違っていました。

> GetDlgCtrlIDです。
目的のボタンのグループに行き、IDを取得、クリックしてみましたがうまく行きませ
んでした。考え方が間違っているでしょうか。

詳しく調べてみました↓
0036051C 地図帳 Afx:400000:b:100100:6:3a4062d
-014905C2 " AfxWnd42
-009D061A " AfxWnd42
-01490602 " AfxWnd42 ←ボタンのグループ, ここのボタンを押したい

コントロールの部分です。
SetForegroundWindow(Wnd3); //ボタンのグループをアクティブにする
Sleep(200);
wParam = GetDlgCtrlID(Wnd3);

SendMessage(Wnd3, WM_LBUTTONDOWN, wParam, 0);
SendMessage(Wnd3, WM_LBUTTONDOWN, wParam, 0);
SendMessage(Wnd3, WM_LBUTTONUP, wParam, 0);
SendMessage(Wnd3, WM_LBUTTONUP, wParam, 0);


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

できるかワカリマセンが
親ウィンドウに WM_COMMAND を投げてみるのはどうでしょうか?

::SendMessage( Wnd2, WM_COMMAND , ( WPARAM )::GetDlgCtrlID( Wnd3 ), ( LPARAM )
0L );


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

思うに、WM_LBUTTONDOWNと一緒に流しているWPARAMとLPARAMの内容がおかしくないですか?
MSDNのWM_LBUTTONDOWNやWM_LBUTTONUPを見る限りではこういうパラメータにはなっていない
と思いますが。
それとも私が知らないだけでこういうパラメータもありなんでしょうか。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

AfxWnd42とはどんなコントロールでしょうか?
本当にボタンかどうか怪しい・・と思う。


返信引用
みず
 みず
(@みず)
ゲスト
結合: 19年前
投稿: 8
Topic starter  

> MSDNのWM_LBUTTONDOWNやWM_LBUTTONUPを見る限りではこういうパラメータにはなって
いないと思いますが。
WM_LBUTTONDOWN関係をもう一度調べてみます。

> AfxWnd42とはどんなコントロールでしょうか?
Spyで検出したレベルなので内容までは分からないです。
見た目はTool Barにボタンが配置されているようなのですが・・・・

情報が少なくてすみません。
AfxWnd42の情報も探してみます。


返信引用
みず
 みず
(@みず)
ゲスト
結合: 19年前
投稿: 8
Topic starter  

> それとも私が知らないだけでこういうパラメータもありなんでしょうか。
結論から言いますとナシのようです。

地図帳ソフトでどの様に受け取られているかデバッグしながら修正しました。
WPARAMとLPARAMの使い方が間違っていたようです。

みなさま、お騒がせしました。_(..)_
(初めてのトライでした。)

AfxWnd42に関してはもう少し調べてみます。
(最近は中国語のサイトが多いですね。)


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました