初歩的な疑問でしょうが、すいません。
CreateWindow()でウィンドウを作成した場合、OS側の都合により、ウィンドウハンドル(HWND)のさす値が変わったりすることってありますか?
ある特定のウィンドウを扱う為のHWNDの値は,作成から削除までの間,変化しません。
というか,そうでないと途中でウィンドウが迷子になります。
YuOさんの話に重なりますけれど、
HWNDと言うのはOS側も含めてウインドウを特定するために使用するものです。
本来、ハンドルと呼ばれる物は対象を特定するための用途で使われています。
(ファイルハンドルとか、イベントハンドルとか)
これをOSの都合でころころ変えられてしまうとアプリケーションはハンドルで
ウインドウを特定できなくなってしまいます。
ですから、ウインドウが生成されて消滅するまでハンドルの値は変わりません。
仮にプログラム中でそんな事が起こっているとすると
それはプログラムミスでハンドルが格納されている変数の中身を書き換えてしまった時くらいでしょう。
#本題を外れますが
マネージドアプリの Windows フォームでは、ウィンドウスタイルを変える際に、勝手にウィンドウが作り直されるというような記事をどこかで読んだ覚えがあります。
また、Control.RecreateHandle というメソッドもあったりします。
Windows フォームでも、Handle プロパティによって hWnd を取得することは可能なので、ウィンドウハンドルを DLL などのアンマネージコードに渡して保持させていたりするとどうなるのかなと不安です。
ただ、これらによってハンドルの値が変わるかどうかはわかりません。
追伸:
Control.RecreateHandle に似ている名前のメソッドを発見。
MFC の COleControl::RecreateControlWindow 。
これはハンドルが変わったりするんでしょうか…?
マネージドの方は使った事がないので良くわからないのですけれど、
内部的にウインドウの管理を行っているから外側である時点で取得したHWNDを
そのまま使いまわしてはならぬという内容の記述があるのであれば、
必要なタイミングでその都度渡すとかしないといけない事になりそうですね。
COleControl::RecreateControlWindowはウインドウを破棄して作成しなおすと
説明にはっきり書いてありますけれど、作成しなおした時に前と同じHWNDを
保障する事が可能なんですかねぇ?
無理なら当然違うHWNDになると思うのですけれど。
なるほど。ウィンドウハンドルは変化しないということですね。
ありがとうございました。
( ´ー`)y-~~ なんか解決してるみてーだけど、気になる話題があるな。
DelphiのVCLのコード追っかけてると、ウィンドウスタイルを変えた時に
おもいっきりDestroyWindow()して、CreateWindowEx()してんのな。
おそらく、同じHWND値を保証するのは難しいだろうな。
で、そんなDelphiを作った連中がこぞってMSに移ったという事は……。
え?
変わることもあるのですか?
(特定の)同じウィンドウの場合
>ある特定のウィンドウを扱う為のHWNDの値は,作成から削除までの間,変化しません。
>おもいっきりDestroyWindow()して、CreateWindowEx()してんのな。
これは別のウィンドウになります。
「作成から削除までの間」ではないですから話が別でしょ。
直接CreateWindow(Ex)を使う限り,問題はないでしょ。
# だから,あったら困るってば
何らかのライブラリがあり,そのライブラリでウィンドウスタイルを
変えるときに(noneme)さんの仰るようなことが行われる可能性は
あると思います。
typo.ごめんなさい。
正(noneme)さん
誤(noname)さん
何やってんだ>私
重ね重ねすみません。>(noname)さん
誤(noneme)さん
正(noname)さん
えーっと、ですから、WindowsAPIを直接コールしてる間は、ウィンドウスタイルを変更したり、そのほかウィンドウの属性をいじっても大丈夫ですよね?
> WindowsAPIを直接コールしてる間は
大丈夫だと思われます。
Win32 API よりも上位にある .NET Framework やら Delphi やらを使っていると、保証はできかねます、という話ですね。
> これは別のウィンドウになります。
> 「作成から削除までの間」ではないですから話が別でしょ。
> 直接CreateWindow(Ex)を使う限り,問題はないでしょ。
そうですが、より上位のライブラリを使っている場合、スタイル変更のために作り直された時点で「作成から削除までの間」を抜けてしまうということは、なかなか意識できるものではありません。
そういうことが .NET Framework で行われているかもしれないというのはちょっと怖い…
Delphi の場合は誰が作った VCL だか存じませんが、標準のものだと困りますね。
#まぁ、今回の件には関係ない話ではありますが。
ツイート | ![]() |