2017-07-06 17 views
0

一時ハンドルで問題が発生しました。HWndから永久CWndを取得

私がここで読んだ通り、What is the lifetime of a CWnd obtained from CWnd::FromHandle? CWnd::FromHandle()は、一時的なハンドルを作成します。私たちの計画は、後で使うためにハンドルを保存することでしたが、これは機能しません。

CWnd::FromHandlePermanent()も試しましたが、これは何とかnullポインタを返します。

また、mpWnd->Attach(mhWnd);がアクセス違反の例外をスローしました。

可能であれば、CWndを保存する場合は、HWndではなくCWndを保存し、CWndが必要な場合はFromHandle()と呼び出してください。 誰かがこれに対する解決策を知っていますか?

+0

CWndはハンドルと同じではなく、単なるWindowオブジェクトポインタです。ウィンドウが開いている限り "実際の"ハンドルはhWndです –

+0

あなたはすでに解決策を知っています。なぜあなたはそれを使用しないのですか? – IInspectable

答えて

0

あなたサブクラス既存のウィンドウ場合にのみ、恒久的なCWndオブジェクトを取得するか、CWnd::Create機能の一つでCWndを作成します。

を使用する場合は、Attachを使用してください。 Attachは、SubclassWindowおよび内部Createフックによって使用されます。サブクラス化せずにAttachを使用すると、ウィンドウは破壊時にハンドルマップから削除されません。

Attach関数でエラーが発生した場合、mpwndオブジェクトが無効であるか、CWndオブジェクトが既にサブクラス化されています。

また、CWndポインタを保存する理由はわかりません。 ハンドルを使用し、必要に応じてFromHandleを使用してください。ウィンドウのサブクラス化の欠点は、常にです。プログラムが後でウィンドウのサブクラス化を試みると、最終的にはサブクラス化されているため、失敗します。

また、あなたの質問には情報がありません。WHYあなたはこれをしたいと思います。

関連する問題