• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Modalダイアログを他のThreadから閉じたい)

Modalダイアログを他のThreadから閉じる方法

このQ&Aのポイント
  • VC++6.0のMFCプロジェクトで、Modalダイアログを他のThreadから閉じる方法を教えてください。
  • WorkerThreadからSendMessageを使ってMyDialogにメッセージを送り、EndDialog()を実行することで、Modalダイアログを閉じることができます。
  • 間違いがあれば指摘してください。また、他の質問への回答もお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.1

CWnd(及びその派生)オブジェクトとハンドルとの関係は スレッド毎に管理されます。 つまり、CWndオブジェクトはそのウィンドウを作成したスレッドでのみ、 有効であり、他のスレッドからはアクセスできません。 (絶対不可能というわけではなく、出来てしまうこともあります。 しかし、いつハンドル - オブジェクト関係が壊されても文句の言えない、 危険な状態であることには変わりないので、 避けるべきです。以下、"アクセスできない"とは、このような意味であり、 ”やってみたらできちゃったから、このまま使っちゃえ!!” 的な行動は止めてください。いつか痛い目にあいます。) 例えば、ワーカー・スレッドから、メインウィンドウにはアクセスできません。 どうしても、アクセスしたい場合は、目標のhWndへSendMessageなり PostMessageなりを行います。 http://msdn.microsoft.com/ja-jp/library/c251x6s1(VS.80).aspx

simanoha
質問者

お礼

ありがとうございます! 上記の補足についても納得しました。 以下のように、::PostMessage()を実行することで、問題を解決することができました。 HWND hWnd = m_dlgTest.GetSafeHwnd(); if (hWnd) { ::PostMessage(hWnd, WM_MESSAGE_CLOSEDIALOG, 0, 0); }

その他の回答 (1)

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

補足です。 (蛇足かもしれませんが、念のため) 私のいうPostMessage()やSendMessage()はCWndクラスのメンバ関数でない、 Win32API関数の方です。 質問のコードでいえば pWnd->SendMessage(WM_MESSAGE_CLOSEDIALOG, 0, 0); でなく SendMessage(hWnd, WM_MESSAGE_CLOSEDIALOG, 0, 0); となります。 これなら、hWndを作成したスレッド以外からも使えます

関連するQ&A