ウィンドウハンドルは変わるのでしょうか?

解決


初心者  2005-04-13 21:12:51  No: 57008  IP: 192.*.*.*

初歩的な疑問でしょうが、すいません。
CreateWindow()でウィンドウを作成した場合、OS側の都合により、ウィンドウハンドル(HWND)のさす値が変わったりすることってありますか?

編集 削除
YuO  2005-04-13 22:00:52  No: 57009  IP: 192.*.*.*

ある特定のウィンドウを扱う為のHWNDの値は,作成から削除までの間,変化しません。
というか,そうでないと途中でウィンドウが迷子になります。

編集 削除
PATIO  2005-04-14 16:40:53  No: 57010  IP: 192.*.*.*

YuOさんの話に重なりますけれど、

HWNDと言うのはOS側も含めてウインドウを特定するために使用するものです。
本来、ハンドルと呼ばれる物は対象を特定するための用途で使われています。
(ファイルハンドルとか、イベントハンドルとか)
これをOSの都合でころころ変えられてしまうとアプリケーションはハンドルで
ウインドウを特定できなくなってしまいます。
ですから、ウインドウが生成されて消滅するまでハンドルの値は変わりません。
仮にプログラム中でそんな事が起こっているとすると
それはプログラムミスでハンドルが格納されている変数の中身を書き換えてしまった時くらいでしょう。

編集 削除
シャノン  2005-04-14 21:53:04  No: 57011  IP: 192.*.*.*

#本題を外れますが

マネージドアプリの Windows フォームでは、ウィンドウスタイルを変える際に、勝手にウィンドウが作り直されるというような記事をどこかで読んだ覚えがあります。
また、Control.RecreateHandle というメソッドもあったりします。
Windows フォームでも、Handle プロパティによって hWnd を取得することは可能なので、ウィンドウハンドルを DLL などのアンマネージコードに渡して保持させていたりするとどうなるのかなと不安です。

ただ、これらによってハンドルの値が変わるかどうかはわかりません。

追伸:
Control.RecreateHandle に似ている名前のメソッドを発見。
MFC の COleControl::RecreateControlWindow 。
これはハンドルが変わったりするんでしょうか…?

編集 削除
PATIO  2005-04-15 16:07:07  No: 57012  IP: 192.*.*.*

マネージドの方は使った事がないので良くわからないのですけれど、
内部的にウインドウの管理を行っているから外側である時点で取得したHWNDを
そのまま使いまわしてはならぬという内容の記述があるのであれば、
必要なタイミングでその都度渡すとかしないといけない事になりそうですね。

COleControl::RecreateControlWindowはウインドウを破棄して作成しなおすと
説明にはっきり書いてありますけれど、作成しなおした時に前と同じHWNDを
保障する事が可能なんですかねぇ?
無理なら当然違うHWNDになると思うのですけれど。

編集 削除
初心者  2005-04-15 17:57:10  No: 57013  IP: 192.*.*.*

なるほど。ウィンドウハンドルは変化しないということですね。
ありがとうございました。

編集 削除
(noname)  2005-04-17 12:37:55  No: 57014  IP: 192.*.*.*

( ´ー`)y-~~ なんか解決してるみてーだけど、気になる話題があるな。

DelphiのVCLのコード追っかけてると、ウィンドウスタイルを変えた時に
おもいっきりDestroyWindow()して、CreateWindowEx()してんのな。
おそらく、同じHWND値を保証するのは難しいだろうな。

で、そんなDelphiを作った連中がこぞってMSに移ったという事は……。

編集 削除
初心者  2005-04-17 14:18:42  No: 57015  IP: 192.*.*.*

え?
変わることもあるのですか?

編集 削除
RiSK  2005-04-17 15:26:10  No: 57016  IP: 192.*.*.*

(特定の)同じウィンドウの場合

>ある特定のウィンドウを扱う為のHWNDの値は,作成から削除までの間,変化しません。


>おもいっきりDestroyWindow()して、CreateWindowEx()してんのな。

これは別のウィンドウになります。
「作成から削除までの間」ではないですから話が別でしょ。
直接CreateWindow(Ex)を使う限り,問題はないでしょ。
# だから,あったら困るってば

何らかのライブラリがあり,そのライブラリでウィンドウスタイルを
変えるときに(noneme)さんの仰るようなことが行われる可能性は
あると思います。

編集 削除
RiSK  2005-04-17 15:27:37  No: 57017  IP: 192.*.*.*

typo.ごめんなさい。

正(noneme)さん
誤(noname)さん

編集 削除
RiSK  2005-04-17 15:29:00  No: 57018  IP: 192.*.*.*

何やってんだ>私
重ね重ねすみません。>(noname)さん

誤(noneme)さん
正(noname)さん

編集 削除
初心者  2005-04-18 19:47:56  No: 57019  IP: 192.*.*.*

えーっと、ですから、WindowsAPIを直接コールしてる間は、ウィンドウスタイルを変更したり、そのほかウィンドウの属性をいじっても大丈夫ですよね?

編集 削除
シャノン  2005-04-18 20:48:55  No: 57020  IP: 192.*.*.*

> WindowsAPIを直接コールしてる間は

大丈夫だと思われます。
Win32 API よりも上位にある .NET Framework やら Delphi やらを使っていると、保証はできかねます、という話ですね。

> これは別のウィンドウになります。
> 「作成から削除までの間」ではないですから話が別でしょ。
> 直接CreateWindow(Ex)を使う限り,問題はないでしょ。

そうですが、より上位のライブラリを使っている場合、スタイル変更のために作り直された時点で「作成から削除までの間」を抜けてしまうということは、なかなか意識できるものではありません。
そういうことが .NET Framework で行われているかもしれないというのはちょっと怖い…
Delphi の場合は誰が作った VCL だか存じませんが、標準のものだと困りますね。

#まぁ、今回の件には関係ない話ではありますが。

編集 削除