地図ソフト上のあるボタンをクリックしたいのですがボタンのハンドルを検出する方法
を教えてください。よろしくお願いします。
環境: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);
とりあえず、
> FindWindow
ではトップレベルのウィンドウしか取得できません。
FindWindowExは親ウィンドウを指定して探せるのでそちらを使ってみるとか、
EnumChildWindowsで子ウィンドウを列挙してみるとか。
(クラス名が明確ならばFindWindowExが楽でしょう)
Blueさま、
有難うございます。
FindWindowExを使って目的のハンドルを取れました。
ここで知っていたら教えて欲しいのですが、ボタンIDを取得する場合、
どの様なAPIを使うのでしょうか?
GetMenuでよいのでしょうか。
ソフトのレイアウトとしては、タイトル枠の下に幾つかのアイコン状のボタンが
並んでいます。
よろしくお願いいたします。
> ボタンIDを取得する場合
GetDlgCtrlIDです。
> 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);
すみません、情報が間違っていました。
> 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);
できるかワカリマセンが
親ウィンドウに WM_COMMAND を投げてみるのはどうでしょうか?
::SendMessage( Wnd2, WM_COMMAND , ( WPARAM )::GetDlgCtrlID( Wnd3 ), ( LPARAM )
0L );
思うに、WM_LBUTTONDOWNと一緒に流しているWPARAMとLPARAMの内容がおかしくないですか?
MSDNのWM_LBUTTONDOWNやWM_LBUTTONUPを見る限りではこういうパラメータにはなっていない
と思いますが。
それとも私が知らないだけでこういうパラメータもありなんでしょうか。
AfxWnd42とはどんなコントロールでしょうか?
本当にボタンかどうか怪しい・・と思う。
> MSDNのWM_LBUTTONDOWNやWM_LBUTTONUPを見る限りではこういうパラメータにはなって
いないと思いますが。
WM_LBUTTONDOWN関係をもう一度調べてみます。
> AfxWnd42とはどんなコントロールでしょうか?
Spyで検出したレベルなので内容までは分からないです。
見た目はTool Barにボタンが配置されているようなのですが・・・・
情報が少なくてすみません。
AfxWnd42の情報も探してみます。
> それとも私が知らないだけでこういうパラメータもありなんでしょうか。
結論から言いますとナシのようです。
地図帳ソフトでどの様に受け取られているかデバッグしながら修正しました。
WPARAMとLPARAMの使い方が間違っていたようです。
みなさま、お騒がせしました。_(..)_
(初めてのトライでした。)
AfxWnd42に関してはもう少し調べてみます。
(最近は中国語のサイトが多いですね。)