C++ 子ウィンドウのハンドルの取得方法について

このQ&Aのポイント
  • C++で別ウィンドウのアプリケーションを動かす際に、子ウィンドウのハンドルを取得する方法についてアドバイスをいただきたいです。
  • 現在、SPY++を使ってウィンドウ名やクラス名を探し、FindWindowExまたはGetDlgItem関数を使って取得していますが、同じクラス名・ウィンドウ名でコントロールIDも0の場合、どちらを取得すればいいか迷っています。
  • 知人にSPY++で上から何番目にあるかを指定して取得する方法があるかもしれないと聞いたのですが、具体的な方法がわかりません。
回答を見る
  • ベストアンサー

C++ 子ウィンドウのハンドルを取得したいのですが

C++で別ウィンドウのアプリケーションを動かすというものを作っているのですが、そのウィンドウの子ウィンドウのハンドルを取得するのに困ったことがあるのでアドバイスをいただけると大変ありがたいです。 基本的にSPY++というソフトを使ってウィンドウ名その他を探し、FindWindowExまたはGetDlgItem関数を使って取得という方法をとっているのですが、クラス名、ウィンドウ名が全く同じもので、コントロールIDも0という状態のものがあり、片方を取得したい場合どうしたらよいのかという状態です。 知人にSPY++でみて上から何番目にあるやつと指定して得ることができる方法があるかもしれないと聞いたのですが、よくわかりません。 例としてその画像ものせますので、良い知恵がありましたらお貸しください。

この投稿のマルチメディアは削除されているためご覧いただけません。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

FindeWindowExの二番目の引数を使えば次のウィンドウをとれます。 HWND hFirstWnd = ::FindWindowEx(hParentWnd, NULL, TEXT(""), TEXT("")); if (hFirstWnd != NULL) { HWND hSecondWnd = ::FindWindowEx(hParentWnd, hFirstWnd, TEXT(""), TEXT("")); } http://msdn.microsoft.com/ja-jp/library/cc410853.aspx のhwndChildAfterのところを参照。

関連するQ&A

  • ウインドウハンドルのつかみ方について質問です。

    visualbasic6.0で開発をしています。 例えば、同親内の子コントロールに同じ「edit」クラスが2つ存在していたとします。 私は、ハンドルを掴むのにクラス名とキャプション名で掴んでいます。 しかし、クラス名は一緒で、キャプション名は存在しません。 すると、2つのコントロールを区別することができません。 現在は、FindWindowExで取得したハンドルを、アプリケーション「spy」等であっているか確認しています。 上記のような、クラス名とキャプションで判断できないものは、皆さんどのようにハンドルを取得していますか? 自分のように順次取得して、順番で判断していますか? だとしたら、FindWindowExで取得した順番はOS環境や、取得する時々で変わったりしないモノなのでしょうか? よろしくお願いします。

  • 子ウインドウを特定する

    VisualBasic2008Expressでプログラミングをしています。 楽天ツールバーの検索窓のハンドルを取得してsendmessageで文字列を送るプログラムを作ろうとしています。 UISpy.exeで調べてところ"edit"というクラス名で深い階層にあるようで、FindWindowExでは取得できないようです。なので下のURL http://homepage2.nifty.com/nonnon/SoftSample/VB.NET/SampleEnumWindows.html のコードを基に検索窓のクラス名"edit"からハンドルを取得できるように作り替えようと思っています。 ですが、このenumChildWindowsやGetClassNameの使い方が全く分からない。FindWindowExの場合は、クラス名とタイトル名を指定すればハンドルが返ってくるのですが、これはコールバック関数やポインタが出てきてどう扱えばいいのかが分からず手が出せない状態です。 列挙された子ウインドウの中からクラス名"edit"を特定してハンドルを取得するには、どのようにコードを作り直せばよいのでしょうか。何も分からない状態でお手数をおかけするでしょうが、どうかよろしくお願いします。

  • VBAでコントロールのハンドルを取得したい

    Excel2000のVBAでFormに配置したコントロールのハンドルを取得するにはどうしたらよいのでしょうか? 目的は、Winsock API(ws2_32.dll)の WSAAsyncSelect関数の2番目の引数にセットする値を取得することです。USER32.dll の GetDlgItem が使用できそうなことがわかったのですが、こちらもその2番目の引数にセットするIDがわかりません。

  • C# ウィンドウハンドルの取得

    取得したいウィンドウハンドルをAとします。 UI Spyで調べたところ、IdentificationのClassNameがAと同じものが複数ありました。 このような場合はどのようにしてAのウィンドウハンドルを求めればよいのでしょうか。

  • FinderSystem等のツールで取得できないハンドルを取得するには?

    他のアプリケーションのボタンで操作したいと思い FinderSystemやNuke++等のツールを使いウィンドウハンドルを調べ SendMessage関数を使ってコマンドボタンのクリックをする所までは できるのですが、ツール等でウィンドウハンドルを取得できないラベル トグルボタンが存在し、画面上では明らかに存在しているのですが そのボタンには反応せず、大きな枠組みでウィンドウハンドルを 取得してしまいます。FindWindow、FindWindowEx、GetWindow EnumChildWindowで子ウィンドウのハンドルまで調べたのですが 値が0になってしまいます。他にもボタンだけではなく タブコントロールも操作したいと思っているのですが 同様に子ウィンドウハンドルの値は0になってしまいます そもそもウィンドウハンドルを全て取得することは不可能なのでしょうか? いろいろな他のアプリケーションのコマンドボタンをFinderSystemで調べて 取得できる場合とできない場合があり、この差は何なのか 疑問に思っています。ご存知のお方がいれば お手数ですが教えていただけないでしょうか? 開発環境は、WindowsXP、VB6.0です。 宜しくお願いいたします。

  • ウィンドウハンドルの取得方法

    ダイアログの表示されないEXEを起動させて、FindWindowを使用してそのEXEのウィンドウハンドルを取得したいのですが上手くいきません・・。 FindWindowの第一引数は「ウィンドウのクラス名」を指定するようなのですが、「ウィンドウのクラス名」の意味が良くわかりません。第二引数は「ウィンドウ名」を指定するようなのですが、今回のようなアンダーグラウンドで動くEXEには「ウィンドウ名」は無いと思ってよいのでしょうか? ちなみにダイアログのあるEXEならウィンドウハンドルを取得できます。 お分かりの方がいらっしゃれば、ご教授願います。

  • ウインドウの取得

    かんたんYouTubeプレーヤーというソフトのウインドウハンドルを取得し、プレーヤーウインドウのサイズや位置を変更するプログラムをVB2008で作成しようとしました。このプレーヤーはリストウインドウとプレーヤーウインドウの二つがあるのですが、窓ちぇき!というソフトでタイトルとクラス名を調べたら二つとも同じタイトルとクラス名になっていました。これだとFindWindow関数でウインドウハンドルを取得できません。どうすればよいでしょうか。

  • .net frameworkで作られたフォームのウィンドウハンドルとインスタンスハンドルの取得方法

    このたびC++で.net frameworkを使い、アプリケーションを製作しているのですが、フォームのウィンドウハンドルと、アプリケーションのインスタンスハンドルの取得方法が分からなくて困っています。取得する方法はあるのでしょうか? 回答をお待ちしています。どなたかおねがいしますm(_ _)m

  • 他アプリケーション’(ウィンドウ)のハンドル取得方法

     GetWindowTextを用いて、他ウィンドウ、他アプリケーション内のテキストボックスに表示されている、文字列を取得したいです。他アプリケーションは、自分のアプリケーションから、shell関数を用いて起動します。他ウィンドウのハンドル値は、shellの返り値でわかるのですが、テキストボックスのハンドル値が分かりません。 どなたか、 ご教授願います。 おねがいします。

  • ウィンドウのハンドルからファイル名を取得について

    ウィンドウのハンドルからファイル名を取得する方法について質問です。 GetWindowThreadProcessIdで、スレッドのIDを取得、 OpenProcessで、ハンドルを開く、 EnumProcessModulesで、モジュールのハンドルを取得、 GetModuleFileNameExで、パス名を取得、 でファイル名を取得しようとしているのですが一部のウィンドウのハンドルは失敗します。 Windows XPでは取得できるのですが、Windows 7では失敗します。 EnumProcessModulesで取得が失敗しているようです。 私の予想ではOpenProcessでのアクセス権の指定に問題があるのではと 思って調べてみたのですが分かりませんでした。 GetWindowModuleFileNameでも試してみたのですが、 取得に失敗します。 ちなみに、OpenProcessのアクセスフラグは 「PROCESS_QUERY_INFORMATION | PROCESS_VM_READ」です。 どうすればいいのでしょうか? 他の方法があれば、それでも構いません。 とにかく、他のウィンドウ(プロセス)のファイル名を取得出来れば、 どんな方法でも構いません。 よろしくお願いします。

専門家に質問してみよう