トップ回答者
MFCのWM_USERメッセージを外部(自アプリ以外)からの物はハジきたい

質問
-
VS2008スタンダードのMFCでWindows7の環境です。
ユーザーメッセージを使って処理をしているところがあるでのすが、
現在、外部からいたずら(妨害)をされてしまって、ユーザーメッセージ(WM_USER+1)が自分のウインドウに勝手にきてしまいます。
メッセージを受け取るところと、投げるところすべてに、ブレークポイントを張りますと、
メッセージを投げていないのに、いきなり受けるところ(だけ)でブレークしてしまいます。
ユーザーメッセージを(WM_USER+100)などに変更すれば、おきないことは確認できました。
lParamやwParamに、何かキーになるランダムな値を渡せば、あるていどは外部からのユーザーメッセージを防ぐことはできると思いますが、
ユーザーメッセージを、根本的に外部の物はハジくことはできるのでしょうか?
また、受け取ったメッセージが、自分が投げたものか、外部から来たものか、が判断できるフラグのようなものはあるのでしょうか?
回答
-
全体の補足を。。。
まずは、メッセージについてのリファレンスのトップ http://msdn.microsoft.com/en-us/library/windows/desktop/ms632586(v=vs.85).aspx
ここが、Window(HWNDそのものに関するもの)のトップです。
メッセージの詳細は、http://msdn.microsoft.com/en-us/library/windows/desktop/ms632590(v=vs.85).aspx
この中のリファレンス(Message Constants)部分に、WM_USER や WM_APP があります(OCM_BASEはいつのまにかシステム扱いに昇格してたのね。。。)。
その他、昔から開発やってた人でも知らなかった。。。なんて内容が出ていたりするので、About... や Using... の部分は見ておくといいかもしれません。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
-
p>現在、外部からいたずら(妨害)をされてしまって、ユーザーメッセージ(WM_USER+1)が自分のウインドウに勝手にきてしまいます。
アプリケーション定義のメッセージはWM_USERではなくWM_APP以降を使います。
WM_USERはコモンコントロールなどが使う領域なので、単にシステムが使っているメッセージと衝突しているだけという可能性があります。
ユーザーメッセージを、根本的に外部の物はハジくことはできるのでしょうか?
また、受け取ったメッセージが、自分が投げたものか、外部から来たものか、が判断できるフラグのようなものはあるのでしょうか?
SetWindowsHookExでWH_CALLWNDPROCを使えば自スレッドから呼び出されたかどうかは分かりますが…。
-
すべての返信
-
p>現在、外部からいたずら(妨害)をされてしまって、ユーザーメッセージ(WM_USER+1)が自分のウインドウに勝手にきてしまいます。
アプリケーション定義のメッセージはWM_USERではなくWM_APP以降を使います。
WM_USERはコモンコントロールなどが使う領域なので、単にシステムが使っているメッセージと衝突しているだけという可能性があります。
ユーザーメッセージを、根本的に外部の物はハジくことはできるのでしょうか?
また、受け取ったメッセージが、自分が投げたものか、外部から来たものか、が判断できるフラグのようなものはあるのでしょうか?
SetWindowsHookExでWH_CALLWNDPROCを使えば自スレッドから呼び出されたかどうかは分かりますが…。
-
-
全体の補足を。。。
まずは、メッセージについてのリファレンスのトップ http://msdn.microsoft.com/en-us/library/windows/desktop/ms632586(v=vs.85).aspx
ここが、Window(HWNDそのものに関するもの)のトップです。
メッセージの詳細は、http://msdn.microsoft.com/en-us/library/windows/desktop/ms632590(v=vs.85).aspx
この中のリファレンス(Message Constants)部分に、WM_USER や WM_APP があります(OCM_BASEはいつのまにかシステム扱いに昇格してたのね。。。)。
その他、昔から開発やってた人でも知らなかった。。。なんて内容が出ていたりするので、About... や Using... の部分は見ておくといいかもしれません。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
-
質問にお答えいただき、ありがとうございます。
WM_USER を WM_APP に書き換えて無事に動作することができました。
今までずっと(5年以上)WM_USERを使用しつづけて、問題が起きていなかったのが不思議なくらいです。
SetWindowsHookExでWH_CALLWNDPROCを使えば・・・
ご教授ありがとうございます。勉強させていただきます。
ただ、いたずらは本当にあったようでして、今まではエディットボックスからフォーカスが抜けたときに、いたずらメッセージが来ていたのですが、
今日の朝は、同じWM_USERの番号を使用した状態で、エディットボックスにフォーカスが来たときに、いたずらメッセージが来るようになっていました。
どこかの妖精さんが間違いを教えようとしていたのでしょうか?本当のところは解りませんです。