
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- JavaScript javaScriptで画面に値を入れるには 1 2022/08/14 12:27
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングについて。 1つ...
-
gccを行ってもexeファイルが生...
-
c言語
-
visual studio 2022でのC#プロ...
-
C# DatagridviewにExcelシート...
-
mallocについて
-
C言語って古いですか?
-
C言語関数違いについて。
-
逆コンパイルと逆アセンブルの...
-
プログラムの実行時に'<'でリダ...
-
パソコン
-
CPUが16bitでも32bitOSでコンパ...
-
Python、プログラミングについ...
-
だれがとけるの?
-
バッチファイルで以下のような...
-
Notepad++の関数リスト表示の変...
-
VisualStudio2022でC言語プログ...
-
License='MIT' ってなんでmitな...
-
C言語 ストリームについて。
-
c言語でイベントフラグを使った...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語
-
gccを行ってもexeファイルが生...
-
大量のデータを読み込んで表示...
-
visual studio 2022でのC#プロ...
-
C++でデスクトップGUIアプリ開...
-
【C言語】全角文字の配列を、全...
-
Windows Formアプリからコンソ...
-
VisualStudio2022でC言語プログ...
-
C#でログファイルにファイルパ...
-
C#でTreeViewのCheckBoxのサイ...
-
c#のTLS1.2での通信について
-
VisualStudioでC++クラスを追加...
-
C言語について。
-
int16_t の _t は何?
-
プログラマー達は何故、プログ...
-
逆コンパイルと逆アセンブルの...
-
C言語の関数のextern宣言
-
c言語でイベントフラグを使った...
-
C言語 関数、変数の宣言について
-
[C言語]fputsとfprintfの違い
おすすめ情報