ウィンドウに送られたメッセージを知る方法 – プログラミング – Home

ウィンドウに送られたメッセージを知る方...
 
通知
すべてクリア

[解決済] ウィンドウに送られたメッセージを知る方法


スイカ
 スイカ
(@スイカ)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

プチ初心者のものでございます。みなさま、教えてください。

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

よろしくお願いします。

[環境]
MFC
Windows2000
Visual Studio6.0


引用未解決
トピックタグ
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

「ウィンドウ(hWndSample)を作り」とありますが、
どうやって作っているのですか?
APIをコールしているのでしょうか?

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


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

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


返信引用
スイカ
 スイカ
(@スイカ)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

PATIOさん、sugarさん、ご回答ありがとうございます。

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

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

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

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


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

SubclassWindow ですかね?
CSampleView の PreTranslateMessage で取れるかも?
だめならフック?


返信引用
スイカ
 スイカ
(@スイカ)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

kazumaさん、ご回答ありがとうございます。

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

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

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


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

> まず、SubclassWindowですが、これは、CWnd::SubclassWindowの事でしょうか?

そのつもりでした。

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

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


返信引用
スイカ
 スイカ
(@スイカ)
ゲスト
結合: 23年前
投稿: 8
Topic starter  

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

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました