内部的に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なのですが・・・オブジェクト生成時に自動的にウィンドウを生成する方法がわかりませんでした。もしこちらが分かればウィンドウありで行くこともできますので、分かる方いらっしゃいましたらお願いいたします。

A 回答 (1件)

一応通知方法はあります。



ウィンドウハンドルの取得も
1.AfxGetMainWnd()->m_hWnd
2.CWnd::GetActiveWnd()->m_hWnd
ということをしなくても、ウィンドウあり
(ディフォルト)であれば、使用する前に
ひとつ関数(コンストラクタはダメ)を
呼んでやれば、きちんとm_hWndがNULL以外の
値になるはずです。
#私はいつもこの方法でウィンドウハンドルを
#取得しています。コンストラクタでは、
#どうやってもNULLになります。

ただし、この方法だと、どうしてもOCXを
使う側が一度呼び出さなければならないため、
Initialize処理としての関数呼び出しが必要に
なりますので、若干不便でしょう。

後は、不可視にしておいて、上から確実に
呼んでもらえるようにしておけば、大丈夫なはず。

どういった風にActiveXを使いたいのか
分かりませんが、一応通知することは可能
だということは分かってください。

ではでは☆
    • good
    • 0
この回答へのお礼

早速のご回答、どうもありがとうございました。
やっぱり、Windowありのコントロールにするのが無難ですかね。
ということで、おっしゃるようにやってみました。最初はやっぱりアクティブ
にならなかったのですが、試行錯誤してみると、どうやらOLEMISC__INVISIBLEATRUNTIMEフラグを立てていたからのようです。
これをはずして、OLEMISC_ACTIVATEWHENVISIBLEを立てたらいけました!
ActiveXって難しいですね~。
どうもお世話になりました。

お礼日時:2001/03/27 14:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!

おしトピ編集部からのゆる~い質問を出題中

お題をもっとみる

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ