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も見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
土曜の昼、学校帰りの昼メシの思い出
週休2日が当たり前の今では懐かしい思い出ですが、昔は土曜日も午前中まで学校や会社がある「半ドン」で、いつもよりちょっと早く家に帰って食べる昼ご飯が、なんだかちょっと特別に感じたものです。
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら「ろうそくの数はあなたが好きな人の数です」と言われ浮気者扱いされたことをいまだに根に持っています。
-
ギリギリ行けるお一人様のライン
おひとり様需要が増えているというニュースも耳にしますが、 あなたが「ギリギリ一人でも行ける!」という場所や行為を教えてください
-
他のウィンドウのボタンを自動的に押したい
C言語・C++・C#
-
他アプリケーション’(ウィンドウ)のハンドル取得方法
Visual Basic(VBA)
-
WinAPIで電卓をクリック
Visual Basic(VBA)
-
-
4
VBAでコントロールのハンドルを取得したい
Visual Basic(VBA)
-
5
親ウインドウにあるOKボタンを押す方法
Visual Basic(VBA)
-
6
コンボボックスの高さを変更したい。
C言語・C++・C#
-
7
EnumChildWindowsの使い方(VBA)
Visual Basic(VBA)
-
8
CString から LPCTSTRの型に変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
ラジオボタンの初期指定
-
VBA .Value=.Value ?
-
最大化と最小化ボタン
-
Swingで作ったウィンドウの最小...
-
ウィンドウにキー送信で ENTER ...
-
親ウインドウにあるOKボタンを...
-
UWSCで特定のChromeのタブをア...
-
VC++でタスクバーに表示させな...
-
他アプリのアクティブな子ウイ...
-
VBAでのタイトルバーの取得
-
クリスタルレポートからPDFを作...
-
C#でファイル転送プログラムWin...
-
ウィンドウ生成時にアクセス違...
-
リストビューでNM_CLICKを受け...
-
ダイアログボックスのタスクバ...
-
ウィンドウが閉じない
-
アクティブでないWindowにショ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで作った新しいウイン...
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
ゲームでは結局どっちが良いの?
-
ExcelのBOOKが消えた!
-
VBA .Value=.Value ?
-
[VBA] UserForm を Excel の W...
-
ラジオボタンの初期指定
-
勝手にウィンドウが開いて止ま...
-
Excelの上下を固定したい
-
【VB2008】 マウス操作の一時的...
-
「&HFFFF」「&H1A」とは?
-
作成したウインドウのサイズを...
-
親ウインドウにあるOKボタンを...
-
他のアプリケーションの終了処理
-
MFC ダイアログ上のID取得につ...
-
ExcelVBAでAPIを使って外部ウイ...
-
EnumChildWindowsの使い方(VBA)
-
Alt+P,Alt+NをPostmessageで送...
-
Vba LongPtrについて教えてくだ...
おすすめ情報