GUIソフト上のボタンを検出する方法

[戻る]
みず [E-Mail] 2006/05/16(火) 13:35:30
地図ソフト上のあるボタンをクリックしたいのですがボタンのハンドルを検出する方法
を教えてください。よろしくお願いします。

環境: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 2006/05/16(火) 13:38:56
とりあえず、
> FindWindow
ではトップレベルのウィンドウしか取得できません。

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

みず [E-Mail] 2006/05/16(火) 17:30:18
Blueさま、

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

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

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

Blue 2006/05/16(火) 17:40:30
> ボタンIDを取得する場合
GetDlgCtrlIDです。

みず [E-Mail] 2006/05/17(水) 09:20:39
> 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);

みず [E-Mail] 2006/05/17(水) 09:23:30
すみません、情報が間違っていました。

> 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 2006/05/17(水) 09:30:36
できるかワカリマセンが
親ウィンドウに WM_COMMAND を投げてみるのはどうでしょうか?

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

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

subaru 2006/05/17(水) 17:47:39
AfxWnd42とはどんなコントロールでしょうか?
本当にボタンかどうか怪しい・・と思う。

みず [E-Mail] 2006/05/17(水) 19:18:52
> MSDNのWM_LBUTTONDOWNやWM_LBUTTONUPを見る限りではこういうパラメータにはなって
いないと思いますが。
WM_LBUTTONDOWN関係をもう一度調べてみます。

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

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

みず [E-Mail] 2006/05/18(木) 14:42:46
[[解決]]
> それとも私が知らないだけでこういうパラメータもありなんでしょうか。
結論から言いますとナシのようです。

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

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

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

古いスレッドには追加発言できません。