ウィンドウに送られたメッセージを知る方法

[戻る]
スイカ 2002/07/23(火) 16:00:56
プチ初心者のものでございます。みなさま、教えてください。

CViewを継承したクラスCSampleViewの中で、OnUpdateが呼び出される度に
CreateViewWindowでウィンドウ(hWndSample)を作り、CSampleViewのクライアント領域
に表示させています。
このhWndSampleウィンドウに送られてくる全てのメッセージを
検知したいのですが、hWndSampleウィンドウのメッセージマップがないので
メッセージが送られてきた事を知る手段がありません。
どのようにしたらいいのでしょうか?

よろしくお願いします。

[環境]
MFC
Windows2000
Visual Studio6.0

PATIO 2002/07/23(火) 16:24:28
「ウィンドウ(hWndSample)を作り」とありますが、
どうやって作っているのですか?
APIをコールしているのでしょうか?

単純にCWndクラスから派生した独自クラスを作成し、
そのクラスのインスタンスを作成して、インスタンスからCreateしては駄目なんでしょうか?
派生した独自クラス内でメッセージハンドラを記述すれば良いだけだと思うのですが。

sugar 2002/07/23(火) 17:00:14
「全てのメッセージを検知したい」ということであれば、
CWnd::WindowProc()という仮想関数を使えばよいのでは。

スイカ 2002/07/23(火) 23:43:26
PATIOさん、sugarさん、ご回答ありがとうございます。

説明が不足していました。申し訳ありません。
先ほどの質問に補足しますと

CSampleViewの中で作ってるウィンドウ(hWndSample)は
シェル拡張のCreateViewWindowにより作られ、それにより
ウィンドウハンドル(HWND hWndSample)を得る事ができます。
そのウィンドウハンドルを何とかして
メッセージを検知するようにしたいです。

検討の付く限りでは、
メッセージを検知する為に、CWndを継承したクラスを作るべきなのかもしれませんが
ウィンドウハンドルからCWndを作成する方法などあるのでしょうか?
(↑全然違うかもしれません)

良きアドバイスください。
再び、どうぞよろしくお願いします。

kazuma 2002/07/24(水) 00:43:46
SubclassWindow ですかね?
CSampleView の PreTranslateMessage で取れるかも?
だめならフック?

スイカ 2002/07/24(水) 14:11:39
kazumaさん、ご回答ありがとうございます。

まず、SubclassWindowですが、これは、CWnd::SubclassWindowの事でしょうか?
ヘルプを読んでみました。この説明によれば
引数に、作ったウィンドウのハンドルhWndSampleをあてて呼び出すと
このウィンドウに飛んできたメッセージをCSampleViewのメッセージマップで処理できる
という事でしょうか?
もしそうだとしたら、CSampleViewに決して飛んでくる事のないメッセージが飛んできて
しまうのですが、
メッセージマップに無理矢理書き込んでしまえばいいのでしょうか?

CSampleView の PreTranslateMessage でトライしてみました。
ですが、メッセージを捕らえる事できません。Spy++でメッセージを調べてみると、メッ
セージが発生しているのですが...

今度は、フックでやってみようと思っていますが、ここまでで何かアドバイスありまし
たら
よろしくお願いします。

kazuma 2002/07/24(水) 17:25:01
> まず、SubclassWindowですが、これは、CWnd::SubclassWindowの事でしょうか?

そのつもりでした。

> 引数に、作ったウィンドウのハンドルhWndSampleをあてて呼び出すと
> このウィンドウに飛んできたメッセージをCSampleViewのメッセージマップで処理できる
> という事でしょうか?

後半がちょっと違います。
新たにCWndの派生クラスを作って、そのSubclassWindowをhWndSampleを渡して呼び出します。
そうすると新たに作ったCWndの派生クラスでメッセージを処理できるということです。

スイカ 2002/07/25(木) 03:02:53
[[解決]]
早速、書かれているとおりにガンバってSubclassWindowを試してみました。
そしたら、hWndSampleあてのメッセージをキャッチできるようになりました。
ありがとうございます。
これで、タイトルの「ウィンドウに送られたメッセージを知る方法」
に対する答えが明快なりましたので、解決にチェックしておきます。

回答していただきました皆様、どうもありがとうございました。

で、実は、大変やっかいもので申し訳ないのですが
キャッチしたい目当てのメッセージが飛んでこないのです。
そのメッセージとは、ユーザーのメニュー選択により発生する
WM_COMMANDなのですが。
spy++で調べてみたら、ポストではなく送信していました。
すみません。あらかじめ、調べておくべきでした。

ですが、どうしてもWM_COMMANDのメッセージをキャッチしたいのです。
送信したメッセージを捕らえる方法などありますでしょうか?

タイトルとは違った内容になってしまったので、新規質問に登録します。
タイトルは「ウィンドウが送信したメッセージをキャッチする」です。
方法などご存知でしたら、そちらにご回答よろしくお願いします。

古いスレッドには追加発言できません。