サブクラス化以外でメッセージをフィルタリングするには?

解決


恭二  2006-09-30 23:51:10  No: 63145  IP: 192.*.*.*

デスクトップのメッセージを検知し、それをこちらで用意したDLLで処理させ、処理したメッセージはデスクトップに飛ばさないようにしたいんですけど、他のプログラムとサブクラス化がかぶった場合にちょっとした面倒があるのであまり使いたくないという感じです。
#ややこしいので、ちょっとわからない部分とかあるので、、

デスクトップをサブクラス化するようなプログラムは多々あるので、他プログラムがミスを犯していたときに被害が及びそうで、、、

メッセージ監視で思いつくのがフックなんですけど、フックでフィルタリングってできるでしょうか??

編集 削除
シャノン  2006-10-01 17:04:58  No: 63146  IP: 192.*.*.*

> デスクトップをサブクラス化するようなプログラムは多々あるので、他プログラムがミスを犯していたときに被害が及びそうで、、、
> メッセージ監視で思いつくのがフックなんですけど、フックでフィルタリングってできるでしょうか??

サブクラス化だってフックの一種です。
すると、他にデスクトップをフックしているプログラムがミスをしていたときの心配も、まったく同じように生じると思うのですが、いかがでしょう?

個人的には、どちらの方法を使おうが、他にヘマをしているプログラムがあったらそいつが悪い、俺は知らん!  という方針を採りますけど。

編集 削除
シャノン  2006-10-01 17:08:51  No: 63147  IP: 192.*.*.*

ちなみに。

> CallWndProc フックプロシージャはメッセージを調べることはできますが、変更することはできません。フックプロシージャがシステムに制御を返した後、このメッセージはウィンドウプロシージャへ渡されます。

だそうです。

編集 削除
恭二  2006-10-02 00:33:19  No: 63148  IP: 192.*.*.*

確かに、同じように生じますね…;

ただ、フック(SetWindowsHookで行う方)はMSDNにCallNextHookExを呼べと明記されているので、どちらかといえばミスが発生しにくいのでは?という思います。
サブクラス化の場合、検索してみると重なったサブクラス化に対しての処置が書かれていない参考サイトがあったり、実際に対処してないプログラムも発見したことがあります。なのでもしかしたら、間違って使われている可能性が高いのでは?と...

どちらにしても、そのプログラムがミスしていたらそいつが悪いと言ってしまえばそれまでなんですが^^;
ただ、原因が自分ではなく他人の場合のバグは、発見および対処が難しいので、なるべく回避したいかなぁと思います。
#でもよくよく考えてみると、結構無理な話ですね...

あと、
>GetMsgProc フックプロシージャは、メッセージの検討と変更を行えます。このフックプロシージャがシステムへ制御を返した後、GetMessage または PeekMessage 関数は、そのメッセージを変更結果と共に、最初にその関数を呼び出したアプリケーションへ渡します。
というのを見つけたのですが、どうやって変更するのかわかりませんでした;

編集 削除
恭二  2006-10-02 00:34:51  No: 63149  IP: 192.*.*.*

>ただ、フック(SetWindowsHookで行う方)はMSDNにCallNextHookExを呼べと明記されているので、どちらかといえばミスが発生しにくいのでは?という思います。

ミスです。

ただ、フック(SetWindowsHookExで行う方)はMSDNにCallNextHookExを呼べと明記されているので、どちらかといえばミスが発生しにくいのでは?と思います。

編集 削除
シャノン  2006-10-02 22:11:57  No: 63150  IP: 192.*.*.*

>あと、
>>GetMsgProc フックプロシージャは、メッセージの検討と変更を行えます。このフックプロシージャがシステムへ制御を返した後、GetMessage または PeekMessage 関数は、そのメッセージを変更結果と共に、最初にその関数を呼び出したアプリケーションへ渡します。
>というのを見つけたのですが、どうやって変更するのかわかりませんでした;

lParam が MSG 構造体へのポインタになっているので、この構造体の中身を変更すればいいんじゃないのかな。
ただし、メッセージの変更はできても、送らなくすることはできないみたいですね。WM_NULL にでも書き換えればいいかな。

ちなみに、CallWndProc と GetMsgProc は違います。
CallWndProc はウィンドウプロシージャが処理するメッセージは全てフックで着ますが、GetMsgProc はメッセージキューに入っているメッセージしかフックできません。
もう少し具体的に言うと、ウィンドウにメッセージを送るには SendMessage と PostMessage という2つの手段がありますが、CallWndProc はどちらで送られたメッセージでも捕捉できるのに対し、GetMsgProc は PostMessage で送られたメッセージしか捕捉できません。

編集 削除
恭二  2006-10-03 15:35:46  No: 63151  IP: 192.*.*.*

あー、なるほど…
なんどか試してみたんですけど、なぜか受け取りたいメッセージがCallWndProcでは取れるのにGetMsgProcでは取れない原因はソレだったのですね…。

うーん、やっぱりサブクラス化以外にはないのかなぁ。
これといった方法がないので、やはりサブクラス化でいくことにします。
ありがとうございました。

編集 削除