TopMostウィンドウについて

[戻る]
いろは 2005/07/08(金) 09:46:10
いろはです。

ウィンドウに設定したTopMostを解除する時に不思議な現象が出ています。
たとえば、、
あるモードレスダイアログを2つ作成し、
 SetWindowPos( &wndTopMost, ..., SWP_NOSIZE|SWP_NOMOVE );
と設定します。
その後、ボタン押下などで片方のTopMost属性を外すべく
 SetWindowPos( &wndNoTopMost, ..., SWP_NOSIZE|SWP_NOMOVE );
としているのですが、属性を解除したくないダイアログについても
TopMostが解除されてしまいます。(Spyにより確認)

調べた所、同一プロセスのウィンドウすべてのTopMostが解除されてしまうようです。

環境は
 Win2000+VC6(MFC使用)
 WinXP+VC2004(.NET使用)
両方の環境で同じような現象になります。
Windowsのバグ?っと思うのですが、『そのやり方は間違ってるぞ』っと
言うような事を教えていただけないでしょうか?

dairygoods 2005/07/08(金) 10:09:28
ヘルプにこんなことが書いてあります。

SetWindowPos
http://www.microsoft.com/japan/msdn/library/ja/jpwinui/html/_win32_setwindowpos.
asp
| 最前面ウィンドウが非最前面ウィンドウになると、
| そのオーナーウィンドウとそれが所有するウィンドウも
| 非最前面ウィンドウになります。

いろは 2005/07/08(金) 10:25:26
dairygoodsさん ありがとうございます。

なるほど。。
と言うか、ありえませんって、、
確かにそういったシチュエーションは少ないですが、言い切って欲しくないですね。。
実際そういう状況を求められているので…
重要なウィンドウだからこそ、TopMostにしているので、その辺は勝手に制御して欲しく無い。
っと愚痴ってみました。

理由がはっきりしてよかったです。
ありがとうございました。

で、解決チェックをしたいのですが、関連することなのでもう少しお付き合いください。
以降、.NETの話です。
Forms::TopMostを使ってTopMostを制御していますが、こちらも同様に、
他のウィンドウのTopMostをFalseに設定すると、WS_EX_TOPMOSTは外れてしまいます。
が、Forms::TopMostの値を見るとTrueのまま。。
ですので、WS_EX_TOPMOST属性が付いているか直接確認したいのですが、
MFCで言う、GetExStyle()にあたる関数を教えて下さい。
当方、最近.NETに移ったばかりなので、目当ての関数を見つけることが出来ませんでした。

よろしくお願いします。

YuO [E-Mail] 2005/07/08(金) 12:45:54
GetWindowLongをP/Invokeすればよいのでは?

いろは 2005/07/11(月) 16:24:25
[[解決]]
遅くなりました。

やはりP/Invokeするしかないのですかね。
.NET FrameworkになるとWin32APIを直接いじる事が少なくなると思っていたので、
『何か別の方法があるんでは?』っと思っていたのですが。。

YuOさん ありがとうございました。

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