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.1
- 回答日時:
対象の子ウィンドウを持っている親ウィンドウのハンドルが
既にあって、コントロールの識別子が分かっているなら、
GetDlgItemを使用すればウィンドウハンドルを取得できると思いますが。。。
この回答への補足
>対象の子ウィンドウを持っている親ウィンドウのハンドルが
>既にあって、コントロールの識別子が分かっているなら、
>GetDlgItemを使用すればウィンドウハンドルを取得できると思います
>が。。。
そうおもってGetDlgItemで親ウィンドウのハンドルと押下する対象のボタンのコントロールID(0x00000032)を使ってやってみたのですが、
戻り値が0000000でボタンのウィンドウハンドルが取得できていないようだったので他の方法で取得できないものかと考え、すべてのウィンドウハンドルを列挙する方法をさがしているのです。
GetDlgIDで取得できない原因として上記の画像が示すように孫ウィンドウであるから取得できないのではないのかと考えています。
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.3
- 回答日時:
>GetDlgIDで取得できない原因として上記の画像が示すように孫ウィンドウであるから取得できないのではないのかと考えています。
その通り。
GetDlgIDに与える「親のハンドル」は、添付画像の
ウィンドウ 001003AA ThunderRT6PictureBoxDC
と書かれているウィンドゥのハンドルでなければなりません。
青で囲っているアプリのウィンドゥは「親ではなく、親の親」なので、これを指定してもエラーになります(「指定のコントロールIDのコントロールは居ない」と言うエラーになる)
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.5
- 回答日時:
こんばんは。
・ちなみに、No.2の指摘は、EumChildWindowsの解説に
・> 子ウィンドウがさらに子ウィンドウを持つ場合、EnumChildWindows 関数はそれらのウィンドウも列挙します。
・と書かれているので、該当しないでしょう。
ボタンコントロールも「子ウィンドウ」なので、EnumChildWindows()APIで列挙出来ます。
実際に実行しましたが、コールバックが入ってきています。
ただし、GetDlgItem()APIを利用した方が賢明であるのは事実です。
No.6
- 回答日時:
僕が書いたNo.4の回答内容は、EnumChildWindowsがボタンコントロールを列挙できることを前提に、列挙されたウィンドウと求めたいボタンコントロールが同一であるとする判定方法が間違っていないか確かめるためのデバッグ方法です。
EnumChildWindowsの仕様から、孫ウィンドウ以下を自ら列挙しに行く必要はないのですが、たとえそうロジックを変更したとしても、判定条件を間違っていたのでは目的を達することはできないと思います。
お探しの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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
他のウィンドウのボタンを自動的に押したい
C言語・C++・C#
-
プロセスIDからウィンドウハンドルを取得する方法
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
-
4
ウィンドウにキー送信で ENTER を送りたい
Visual Basic(VBA)
-
5
ExcelVBAでAPIを使って外部ウインドウのエディットテキストを取得する方法
Visual Basic(VBA)
-
6
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
CTなどでいう,ウィンドウレベ...
-
ウィンドウハンドルって途中で...
-
ラジオボタンの初期指定
-
Excelの上下を固定したい
-
VBA .Value=.Value ?
-
勝手にウィンドウが開いて止ま...
-
MFC ダイアログ上のID取得につ...
-
Console.WriteLine で表示されない
-
エクセルで複数のウィンドウ枠...
-
EnumChildWindowsの使い方(VBA)
-
「&HFFFF」「&H1A」とは?
-
ExcelVBAでAPIを使って外部ウイ...
-
Alt+P,Alt+NをPostmessageで送...
-
他のアプリケーションの終了処理
-
ダイアログをスクロールさせるには
-
Excel VBA での画面最大化のロ...
-
C#でファイル転送プログラムWin...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
勝手にウィンドウが開いて止ま...
-
ゲームでは結局どっちが良いの?
-
Excelの上下を固定したい
-
VBA .Value=.Value ?
-
作成したウインドウのサイズを...
-
Vba LongPtrについて教えてくだ...
-
ExcelのBOOKが消えた!
-
他のアプリケーションの終了処理
-
ラジオボタンの初期指定
-
「&HFFFF」「&H1A」とは?
-
親ウインドウにあるOKボタンを...
-
EnumChildWindowsの使い方(VBA)
-
[VBA] UserForm を Excel の W...
-
MFC ダイアログ上のID取得につ...
-
UWSCで特定のChromeのタブをア...
-
ボタンのハンドルウィンド取得...
-
ExcelVBAでAPIを使って外部ウイ...
おすすめ情報