
OS:Windows Vista Business
開発環境:Microsoft Visual Studio C++ 2005,Microsoft Spy++
XRay(Data Analyze)----.exeを起動し、データファイルを読み込むため
ボタンを押して"開く"ダイアログを表示させたいのですが、ボタンの
キャプションが空白であるためハンドルウィンドが取得できません。
ボタンのコントロールIDがわかっているため、下記のようなプログラムを書いてみたのですが上手くいきません。ご教示お願いいたします。
hWnd=FindWindow("ThunderRT6FormDC",_T("XRay (Data Analyze) --- "));
SetForegroundWindow(hWnd);
hbtn=GetOpenButton(hWnd);
HWND GetOpenButton(HWND hdlg)
{
HWND hbtn = NULL;
::EnumChildWindows(hdlg, FindOpenButton, reinterpret_cast<LPARAM> (&hbtn));
return hbtn;
}
static BOOL CALLBACK FindOpenButton(HWND hwnd,LPARAM lParam)
{
TCHAR tbuf[1024];
::GetWindowText(hwnd, tbuf, sizeof(tbuf)); //表示されているテキストを取得
if ((lstrcmp(tbuf, _T("")) == 0)&&(GetDlgCtrlID(hwnd)==0x00000032)) {
HWND *ret = reinterpret_cast<HWND*>(lParam);
*ret = hwnd;
return FALSE; //探索終了
}
return TRUE; //探索続行
}
画像は青で囲んであるのがアプリのウィンドウ、赤で囲んであるのがハンドルウィンドを取得したいボタンのウィンドウです。

A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
僕が書いたNo.4の回答内容は、EnumChildWindowsがボタンコントロールを列挙できることを前提に、列挙されたウィンドウと求めたいボタンコントロールが同一であるとする判定方法が間違っていないか確かめるためのデバッグ方法です。
EnumChildWindowsの仕様から、孫ウィンドウ以下を自ら列挙しに行く必要はないのですが、たとえそうロジックを変更したとしても、判定条件を間違っていたのでは目的を達することはできないと思います。
No.5
- 回答日時:
こんばんは。
・ちなみに、No.2の指摘は、EumChildWindowsの解説に
・> 子ウィンドウがさらに子ウィンドウを持つ場合、EnumChildWindows 関数はそれらのウィンドウも列挙します。
・と書かれているので、該当しないでしょう。
ボタンコントロールも「子ウィンドウ」なので、EnumChildWindows()APIで列挙出来ます。
実際に実行しましたが、コールバックが入ってきています。
ただし、GetDlgItem()APIを利用した方が賢明であるのは事実です。
No.4
- 回答日時:
なぜうまくいかないかを調べたいのであれば、Spy++で対象のボタンのHWNDを調べた上で、FindOpenButton関数の最初に
if (hWnd==0x001003ca)
hwnd = hwnd;
のように調べたHWNDと一致するか判断する行を追加し、その次の行にブレークポイントを設定して実行します。ブレークがかからなければ、親ウィンドウとして渡しているhdlgが正しくない可能性があります。
ブレークがかかったら、GetWindowTextとGetDlgCtrlIDが何を返しているかを調べれば、if文に与えている条件が正しいか確認できます。lstrcmpが空の文字列を比較できない可能性を排除するために、lstrlen(tbuf)==0に条件を置き換えてみる必要があるかもしれません。
ちなみに、No.2の指摘は、EumChildWindowsの解説に
> 子ウィンドウがさらに子ウィンドウを持つ場合、EnumChildWindows 関数はそれらのウィンドウも列挙します。
と書かれているので、該当しないでしょう。
なお、コントロールIDは親ウィンドウが違えば同じ値を使用できるので、ウィンドウキャプションが空でコントロールIDが0x00000032のウィンドウが複数存在する可能性があります。ボタンの親ウィンドウを別の方法で取得した上で、GetDlgItemを使用したほうが確実でしょう。
No.3
- 回答日時:
>GetDlgIDで取得できない原因として上記の画像が示すように孫ウィンドウであるから取得できないのではないのかと考えています。
その通り。
GetDlgIDに与える「親のハンドル」は、添付画像の
ウィンドウ 001003AA ThunderRT6PictureBoxDC
と書かれているウィンドゥのハンドルでなければなりません。
青で囲っているアプリのウィンドゥは「親ではなく、親の親」なので、これを指定してもエラーになります(「指定のコントロールIDのコントロールは居ない」と言うエラーになる)
No.2
- 回答日時:
こんにちは。
子ウィンドウから更に子ウィンドウへ下っていかないといけないのではないでしょうか。
実行していないのですが、以下のような感じでも無理でしょうか。
static BOOL CALLBACK FindOpenButton(HWND hwnd,LPARAM lParam)
{
HWND *ret = reinterpret_cast<HWND*>(lParam);
TCHAR tbuf[1024];
::GetWindowText(hwnd, tbuf, sizeof(tbuf)); //表示されているテキストを取得
if((lstrcmp(tbuf, _T("")) == 0)&&(GetDlgCtrlID(hwnd)==0x00000032))
{
*ret = hwnd;
return FALSE; //探索終了
}
//更に子ウィンドウを探す(下に子ウィンドウが存在しない事もある為、戻り値は使用出来ない)
::EnumChildWindows(hwnd, FindOpenButton, lParam);
return *ret == NULL ? TRUE : FALSE;//探索続行
}
No.1
- 回答日時:
対象の子ウィンドウを持っている親ウィンドウのハンドルが
既にあって、コントロールの識別子が分かっているなら、
GetDlgItemを使用すればウィンドウハンドルを取得できると思いますが。。。
この回答への補足
>対象の子ウィンドウを持っている親ウィンドウのハンドルが
>既にあって、コントロールの識別子が分かっているなら、
>GetDlgItemを使用すればウィンドウハンドルを取得できると思います
>が。。。
そうおもってGetDlgItemで親ウィンドウのハンドルと押下する対象のボタンのコントロールID(0x00000032)を使ってやってみたのですが、
戻り値が0000000でボタンのウィンドウハンドルが取得できていないようだったので他の方法で取得できないものかと考え、すべてのウィンドウハンドルを列挙する方法をさがしているのです。
GetDlgIDで取得できない原因として上記の画像が示すように孫ウィンドウであるから取得できないのではないのかと考えています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
ラジオボタンの初期指定
-
Excelの上下を固定したい
-
勝手にウィンドウが開いて止ま...
-
他のアプリケーションの終了処理
-
MFCでハンドルを取得するには
-
GLUTでのウィンドウの左上のア...
-
C#でファイル転送プログラムWin...
-
MFC ダイアログ上のID取得につ...
-
VBA .Value=.Value ?
-
名前を付けて保存のウィンドウ...
-
Windows10 名前をつけて保存で...
-
ExcelVBAでAPIを使って外部ウイ...
-
c++/cli .NET Formアプリケー...
-
[VBA] UserForm を Excel の W...
-
Console.WriteLine で表示されない
-
VS2005環境でのSHBrowseForFold...
-
エクセルで1行目から3行目が消...
-
リストビューでNM_CLICKを受け...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
Vba LongPtrについて教えてくだ...
-
勝手にウィンドウが開いて止ま...
-
ラジオボタンの初期指定
-
ゲームでは結局どっちが良いの?
-
検索の画面がでなくなってしま...
-
Excelの上下を固定したい
-
「&HFFFF」「&H1A」とは?
-
ExcelのBOOKが消えた!
-
エクセルで1行目から3行目が消...
-
[VBA] UserForm を Excel の W...
-
【VB2008】 マウス操作の一時的...
-
VBA .Value=.Value ?
-
作成したウインドウのサイズを...
-
DellノートPC購入で悩んでいま...
-
UWSCで特定のChromeのタブをア...
-
Alt+P,Alt+NをPostmessageで送...
-
隠れたウィンドウの画面をキャ...
-
Console.WriteLine で表示されない
おすすめ情報