補足というか、言い換えれば
『非表示』ではないが、他の子の陰で見えない子ウィンドウ。
Banさん。返事遅くなりました。詳しいご解説ありがとうございます。
おかげさまでEnumChildWindow() で取得したハンドルに対して IsVisible() を利用
してかなりハンドルの数をしぼることができました。
>『非表示』ではないが、他の子の陰で見えない子ウィンドウ。
Banさんにアドバイスいただいた部分ですが 上記のウィンドウは判別すればよいので
しょうか??GetClassName()などでクラス名などを取得してみたのですが、判別できそ
うにないのですが・・・何か関数があるのでしょうか??よろしくお願いします
例えば、GetClientRect してみて、幅か高さのどちらか(または両方)がゼロのものと
か。
背後に隠れてるのはどうやって判定すればいいんですかね。
あるコントロールよりも、サイズが大きく、位置がかぶり、Zオーダーで前面にあり、
非表示で無いものがあれば、隠れているということかな。判定面倒くさそう。
ボタンなどのIDをSpy++で調べてその一覧を持っておいて、
実行時にGetDlgItemするだけじゃだめですか?
電卓のバージョンが変わると使えなくなる可能性があるけど、
お手軽な方法のひとつということで。
シャノンさん。yukihiroさん。ありがとうございます。
>『非表示』ではないが、他の子の陰で見えない子ウィンドウ。 ・・・(i)
シャノンさん言われた通り、GetClientWindow()などで判別しているのですが、うま
く判別できていません。
例えば VisualStdioで開発しているとき、ウィンドウは「重ねて表示」とするとMDI
になり、反対にある一つのファイルだけを表示させることもできますよね。
どうやら 一つのファイルだけを表示させているときに 「重ねて表示」させたときの
各ウィンドウの座標を取得しているようです。これが(i)と解釈しているのですがいいの
でしょうか?? もしそうであるならば(i)を判別はどうすればいいの迷っています。
長々とすいませんがよろしくお願いします。
結局やりたいことは何なんでしょうか。
まずは仕様を明確にするのが先かと。
私の意見が華麗にスルーされたところを見ると、
電卓に限った話ではなさそうだということは推測できますが。
本当に他のウィンドウに隠れているウィンドウを除外したいのなら、
EnumChildWindowsじゃなくて、GetTopWindowやGetNextWindowを使って
Zオーダー順に列挙するのが吉。
補足。
実際にはEnumChildWindowsでもZオーダー順に列挙されるかも知れません。
が、それがドキュメントで明言されてないので保証はないかな、と。
yukihiroさんへ。
意見を求めることばかりになってしまいました。yukihiroさんがこのことで不快な気
分受けられたのでしたら、この場を借りて陳謝させていただきます。本当にすいません
でした。以後気をつけます。
>結局やりたいことは何なんでしょうか。
はい。当初は デスクトップ上に表示されているウィンドウのすべてのコントロールの
座標一覧が取得したいかと考えてました。
今は最前面ウィンドウに対して、すべてのコントロールの座標一覧がほしいと考えて
います。
>電卓に限った話ではなさそうだということは推測できますが。
はい。私の投稿時の質問内容に問題がありました。例として電卓を上げたつもりだっ
たのですが、これが反対に困惑の元になってしまったようです。すいませんでした。
>GetTopWindowやGetNextWindowを使ってZオーダー順に列挙するのが吉。
いろいろ調べてみると 、GetTopWindowやGetNextWindowを使ってもウィンドウハンド
ルの一覧を取得することができるようですので 一度やってみます。ご教授ありがとう
ございます。
みなさん。いろいろアドバイスありがとうございました。
とりあえず IsWindowEnabled( )も利用してどうにかできそうなのでここで一度解決さ
せていただきます。
また 何かありましたらよろしくお願いします
解決済みのところすいません。
結局どんなウィンドウがほしいのか伝わってきませんでした。
「仕様を明確に」ってのはそういった要求を明文化することです。
あるいは、なぜ座標一覧が必要なのかという説明があれば、
簡単な別解が見つかる可能性もあります。
というのは、
実は単にマウスカーソルの直下のウィンドウが知りたいだけかも?
というエスパーな推測をしてみたからなわけなんですが。
まあはずしてるでしょうけど。