親ウィンドウ取得、ルートウィンドウ取得の方法

[戻る]
Arutu 2006/07/09(日) 08:07:53
現在
非MFCにて、
VisualC++2005
VisualC++6.0
両方に対応しようとプログラムを書いているのですが、

GetAncestorというAPIがVC6だとコンパイルエラーになり、またVC6ヘルプにも見当たりません。

ということで、GetAncestor を使わずに
GetAncestor( hWnd, GA_PARENT );
GetAncestor( hWnd, GA_ROOTOWNER );
を実現したいと考えています。

GA_ROOTOWNER
の方は、親とオーナーを辿って一番下地のウィンドウを取得するものなので、GetParentと呼び続け
れば再現できそうです。
ただし、環境によっては GetParent で親は取得できるけど親がオーナーの場合 NULL が返るという
話も聞いたことがあり、少々不安です。
詳しい方がいれば情報お待ちしています。

GA_PARENT
は、ヘルプ曰く、親ウィンドウは取得できるけど自身がオーナーの場合は取得に失敗するようです。
 どちらも取得できるGetParentでは再現できそうにありません。
ちなみにオーナーの定義が調べてもイマイチわからなかったのですが、GA_PARENTを使った私の環境
での(WindowsXP)実験では親がNULLな場合とポップアップウィンドウどうやら、オーナーウィンド
ウらしいです。

これらの、実現方法・一口メモ・ツッコミなどお待ちしています。
よろしくお願いします。

瀬戸っぷ [E-Mail] 2006/07/09(日) 13:21:24
> GetAncestorというAPIがVC6だとコンパイルエラーになり、またVC6ヘルプにも見当たり
ません。

ヘルプの方は判りませんが…
winuser.hにありませんか?
WINVERの設定とかではないでしょうか??

Arutu 2006/07/09(日) 14:55:53
windows.h をインクルードする前に、
#define WINVER 0x0500
と書いたらコンパイル通るようになりました。

Windows98以降でサポートされているようですね。
こういった設定は初めて知りました。

ただこれだとWindows95で動かないんですよね……
フリーソフト制作しているので出来ればWindows95も対応したい……とも思うが、もはや使ってる人
数なんて0にも等しいような過去の遺産だし、別にいいかなーとも思う。

うーん、悩む。

もう少し情報集めます。
ありがとうございました。

瀬戸っぷ [E-Mail] 2006/07/09(日) 23:37:06
> ただこれだとWindows95で動かないんですよね……
> フリーソフト制作しているので出来ればWindows95も対応したい……とも思うが、もはや
使ってる人
> 数なんて0にも等しいような過去の遺産だし、別にいいかなーとも思う。

GetProcAddress()で引っ張ってくる…という方法もアリかと。
ちょっと面倒かも知れませんが。

# 私が公開しているモノは…Windows95だとIE4のシェル統合が必要って感じで出してます。
# 動作確認は出来ていませんけど。(手元にWindows95ないし)
# 使っていなかったけど、HeapCompact()のアドレス、ソレで取ってきているな。(9X系未
対応。)

subaru 2006/07/11(火) 10:53:51
GetParentとの動作の違いについてはよくわかりませんが
GetWindow関数にGW_OWNERを指定すればオーナーウインドウが取れるので
それと組み合わせるとか。

Arutu 2006/07/13(木) 14:56:42
[[解決]]
とりあえずウィンドウスタイルに WS_CHILD が指定されている場合のみ GetParent を使うことで 
GetAncestor( hWnd, GA_PARENT ) の代用をすることにしました。(WS_CHILD以外はNULLを返す)

オーナーウィンドウの具体的な定義が調べてもイマイチなので、これで GetAncestor( hWnd, 
GA_PARENT ) と同じ動作が保障されるわけではありませんが、とりあえず妥協という形で解決とさ
せていただきたい思います。

いろいろ提案していただいてありがとうございました。

古いスレッドには追加発言できません。