プチ初心者のものでございます。みなさま、教えてください。
CViewを継承したクラスCSampleViewの中で、OnUpdateが呼び出される度に
CreateViewWindowでウィンドウ(hWndSample)を作り、CSampleViewのクライアント領域
に表示させています。
このhWndSampleウィンドウに送られてくる全てのメッセージを
検知したいのですが、hWndSampleウィンドウのメッセージマップがないので
メッセージが送られてきた事を知る手段がありません。
どのようにしたらいいのでしょうか?
よろしくお願いします。
[環境]
MFC
Windows2000
Visual Studio6.0
「ウィンドウ(hWndSample)を作り」とありますが、
どうやって作っているのですか?
APIをコールしているのでしょうか?
単純にCWndクラスから派生した独自クラスを作成し、
そのクラスのインスタンスを作成して、インスタンスからCreateしては駄目なんでしょうか?
派生した独自クラス内でメッセージハンドラを記述すれば良いだけだと思うのですが。
「全てのメッセージを検知したい」ということであれば、
CWnd::WindowProc()という仮想関数を使えばよいのでは。
PATIOさん、sugarさん、ご回答ありがとうございます。
説明が不足していました。申し訳ありません。
先ほどの質問に補足しますと
CSampleViewの中で作ってるウィンドウ(hWndSample)は
シェル拡張のCreateViewWindowにより作られ、それにより
ウィンドウハンドル(HWND hWndSample)を得る事ができます。
そのウィンドウハンドルを何とかして
メッセージを検知するようにしたいです。
検討の付く限りでは、
メッセージを検知する為に、CWndを継承したクラスを作るべきなのかもしれませんが
ウィンドウハンドルからCWndを作成する方法などあるのでしょうか?
(↑全然違うかもしれません)
良きアドバイスください。
再び、どうぞよろしくお願いします。
SubclassWindow ですかね?
CSampleView の PreTranslateMessage で取れるかも?
だめならフック?
kazumaさん、ご回答ありがとうございます。
まず、SubclassWindowですが、これは、CWnd::SubclassWindowの事でしょうか?
ヘルプを読んでみました。この説明によれば
引数に、作ったウィンドウのハンドルhWndSampleをあてて呼び出すと
このウィンドウに飛んできたメッセージをCSampleViewのメッセージマップで処理できる
という事でしょうか?
もしそうだとしたら、CSampleViewに決して飛んでくる事のないメッセージが飛んできて
しまうのですが、
メッセージマップに無理矢理書き込んでしまえばいいのでしょうか?
CSampleView の PreTranslateMessage でトライしてみました。
ですが、メッセージを捕らえる事できません。Spy++でメッセージを調べてみると、メッ
セージが発生しているのですが...
今度は、フックでやってみようと思っていますが、ここまでで何かアドバイスありまし
たら
よろしくお願いします。
> まず、SubclassWindowですが、これは、CWnd::SubclassWindowの事でしょうか?
そのつもりでした。
> 引数に、作ったウィンドウのハンドルhWndSampleをあてて呼び出すと
> このウィンドウに飛んできたメッセージをCSampleViewのメッセージマップで処理できる
> という事でしょうか?
後半がちょっと違います。
新たにCWndの派生クラスを作って、そのSubclassWindowをhWndSampleを渡して呼び出します。
そうすると新たに作ったCWndの派生クラスでメッセージを処理できるということです。
早速、書かれているとおりにガンバってSubclassWindowを試してみました。
そしたら、hWndSampleあてのメッセージをキャッチできるようになりました。
ありがとうございます。
これで、タイトルの「ウィンドウに送られたメッセージを知る方法」
に対する答えが明快なりましたので、解決にチェックしておきます。
回答していただきました皆様、どうもありがとうございました。
で、実は、大変やっかいもので申し訳ないのですが
キャッチしたい目当てのメッセージが飛んでこないのです。
そのメッセージとは、ユーザーのメニュー選択により発生する
WM_COMMANDなのですが。
spy++で調べてみたら、ポストではなく送信していました。
すみません。あらかじめ、調べておくべきでした。
ですが、どうしてもWM_COMMANDのメッセージをキャッチしたいのです。
送信したメッセージを捕らえる方法などありますでしょうか?
タイトルとは違った内容になってしまったので、新規質問に登録します。
タイトルは「ウィンドウが送信したメッセージをキャッチする」です。
方法などご存知でしたら、そちらにご回答よろしくお願いします。