none
MFCのWM_USERメッセージを外部(自アプリ以外)からの物はハジきたい RRS feed

  • 質問

  • VS2008スタンダードのMFCでWindows7の環境です。

    ユーザーメッセージを使って処理をしているところがあるでのすが、

    現在、外部からいたずら(妨害)をされてしまって、ユーザーメッセージ(WM_USER+1)が自分のウインドウに勝手にきてしまいます。

    メッセージを受け取るところと、投げるところすべてに、ブレークポイントを張りますと、

    メッセージを投げていないのに、いきなり受けるところ(だけ)でブレークしてしまいます。

    ユーザーメッセージを(WM_USER+100)などに変更すれば、おきないことは確認できました。

    lParamやwParamに、何かキーになるランダムな値を渡せば、あるていどは外部からのユーザーメッセージを防ぐことはできると思いますが、

    ユーザーメッセージを、根本的に外部の物はハジくことはできるのでしょうか?

    また、受け取ったメッセージが、自分が投げたものか、外部から来たものか、が判断できるフラグのようなものはあるのでしょうか?

    2013年8月28日 8:50

回答

  • 全体の補足を。。。

    まずは、メッセージについてのリファレンスのトップ 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/

    • 回答の候補に設定 星 睦美 2013年8月29日 7:01
    • 回答としてマーク 星 睦美 2013年9月2日 4:05
    2013年8月29日 2:47
  • p>現在、外部からいたずら(妨害)をされてしまって、ユーザーメッセージ(WM_USER+1)が自分のウインドウに勝手にきてしまいます。

    アプリケーション定義のメッセージはWM_USERではなくWM_APP以降を使います。

    WM_USERはコモンコントロールなどが使う領域なので、単にシステムが使っているメッセージと衝突しているだけという可能性があります。

    ユーザーメッセージを、根本的に外部の物はハジくことはできるのでしょうか?

    また、受け取ったメッセージが、自分が投げたものか、外部から来たものか、が判断できるフラグのようなものはあるのでしょうか?

    SetWindowsHookExでWH_CALLWNDPROCを使えば自スレッドから呼び出されたかどうかは分かりますが…。

    • 回答の候補に設定 星 睦美 2013年8月29日 7:01
    • 回答としてマーク 星 睦美 2013年9月2日 4:05
    2013年8月28日 9:21
  • Hongliangさんの捕捉になります。
    やや受け側の実装が面倒ですが、
    アプリケーションがWindowsセッション内で、
    固有かつ唯一の値であることを保障された
    メッセージを利用する必要がある場合は、

     RegisterWindowMessage()

    を使うこともできます。戻されるメッセージ値は
    0xC000~0xFFFF 範囲の値となります。

    2013年8月29日 0:50

すべての返信

  • p>現在、外部からいたずら(妨害)をされてしまって、ユーザーメッセージ(WM_USER+1)が自分のウインドウに勝手にきてしまいます。

    アプリケーション定義のメッセージはWM_USERではなくWM_APP以降を使います。

    WM_USERはコモンコントロールなどが使う領域なので、単にシステムが使っているメッセージと衝突しているだけという可能性があります。

    ユーザーメッセージを、根本的に外部の物はハジくことはできるのでしょうか?

    また、受け取ったメッセージが、自分が投げたものか、外部から来たものか、が判断できるフラグのようなものはあるのでしょうか?

    SetWindowsHookExでWH_CALLWNDPROCを使えば自スレッドから呼び出されたかどうかは分かりますが…。

    • 回答の候補に設定 星 睦美 2013年8月29日 7:01
    • 回答としてマーク 星 睦美 2013年9月2日 4:05
    2013年8月28日 9:21
  • Hongliangさんの捕捉になります。
    やや受け側の実装が面倒ですが、
    アプリケーションがWindowsセッション内で、
    固有かつ唯一の値であることを保障された
    メッセージを利用する必要がある場合は、

     RegisterWindowMessage()

    を使うこともできます。戻されるメッセージ値は
    0xC000~0xFFFF 範囲の値となります。

    2013年8月29日 0:50
  • 全体の補足を。。。

    まずは、メッセージについてのリファレンスのトップ 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/

    • 回答の候補に設定 星 睦美 2013年8月29日 7:01
    • 回答としてマーク 星 睦美 2013年9月2日 4:05
    2013年8月29日 2:47
  • 質問にお答えいただき、ありがとうございます。

    WM_USER を WM_APP に書き換えて無事に動作することができました。

    今までずっと(5年以上)WM_USERを使用しつづけて、問題が起きていなかったのが不思議なくらいです。

    SetWindowsHookExでWH_CALLWNDPROCを使えば・・・

    ご教授ありがとうございます。勉強させていただきます。

    ただ、いたずらは本当にあったようでして、今まではエディットボックスからフォーカスが抜けたときに、いたずらメッセージが来ていたのですが、

    今日の朝は、同じWM_USERの番号を使用した状態で、エディットボックスにフォーカスが来たときに、いたずらメッセージが来るようになっていました。

    どこかの妖精さんが間違いを教えようとしていたのでしょうか?本当のところは解りませんです。

    2013年8月29日 6:25
  • 質問にお答えいただき、ありがとうございます。

    RegisterWindowMessage()

    とても便利だと思いました。

    この方法を使用すれば、自分以外のメッセージナンバーとカブることは無くなるのですね。

    ご教授ありがとうございます。

    2013年8月29日 6:38
  • 質問にお答えいただき、ありがとうございます。

    自分は、まったくもって勉強が足りないと思いました。

    うろ覚え・・・というか、勘違い覚えをなくすようにがんばりたいです。

    2013年8月29日 6:41
  • 送信側と受信側のスレッドが等しいかどうかを知りたいのであればInSendMessageがあります。

    2013年8月29日 10:56