質問: ウィンドウのないactivexコントロールへのメッセージ通知方法 内部的にwinsock2を使用して別のサーバアプリケーションと通信を行うactivexコントロールを作成しています。サーバからのデータ受信を非同期で行うため、wsaasyncselect()関数を使用して指定したウィンドウにwinsockからイベントメッセージ(メッセージidはwm_user+1を使用)を通知させます。 コントロールをウィンドウなしのアクティベーション使用で開発しているので、wsaasyncselect()のメッセージ通知対象ウィンドウがコントロール内にありません。 コンテナによりコントロール充てにメッセージを送ってくれるということなので、コンテナのウィンドウハンドルを取得し、wsaasyncselect()のメッセージ通知対象ウィンドウに設定しました。が、コントロールのonmessagewindowless()にwm_user+1のイベントは来ていないようです。 私が試したウィンドウハンドルは、次のコードで取得できるものです。 1. afxgetmainwnd()->m_hwnd 2. cwnd::getactivewindow()->m_hwnd (cwndは使用するなとありましたが) 取得するウィンドウハンドルが間違っているのでしょうか?それとも、コンテナアプリケーションはwm_userメッセージをコントロールに送ることができないのでしょうか?もしくは、コンテナにwm_user+1のメッセージはコントロールへ、という設定をしてやる必要があるのでしょうか? なお、なぜウィンドウありのコントロールにしないかと申しますと、ウィンドウありだとコンテナ(ieを想定)に乗った直後にウィンドウが生成されず、自分のウィンドウハンドルを取得しようとするとnullが返ってしまうからです。ユーザがマウスで一度クリックすればokなのですが・・・オブジェクト生成時に自動的にウィンドウを生成する方法がわかりませんでした。もしこちらが分かればウィンドウありで行くこともできますので、分かる方いらっしゃいましたらお願いいたします。
回答: 一応通知方法はあります。 ウィンドウハンドルの取得も 1.afxgetmainwnd()->m_hwnd 2.cwnd::getactivewnd()->m_hwnd ということをしなくても、ウィンドウあり (ディフォルト)であれば、使用する前に ひとつ関数(コンストラクタはダメ)を 呼んでやれば、きちんとm_hwndがnull以外の 値になるはずです。 #私はいつもこの方法でウィンドウハンドルを #取得しています。コンストラクタでは、 #どうやってもnullになります。 ただし、この方法だと、どうしてもocxを 使う側が一度呼び出さなければならないため、 initialize処理としての関数呼び出しが必要に なりますので、若干不便でしょう。 後は、不可視にしておいて、上から確実に 呼んでもらえるようにしておけば、大丈夫なはず。 どういった風にactivexを使いたいのか 分かりませんが、一応通知することは可能 だということは分かってください。 ではでは☆