none
WM_などの定数 RRS feed

  • 質問

  • Visul Studio2010 ExpressEdition C#で、勉強中のものです。

    システムで定義されているはずの定数(WM_で始まるものや、Wparamやら)を、ソース中でシンボルで扱いたいのですが、そのまま記述しても

    「名前??は、現在のコンテキスト内に存在しません」

    というエラーが出ます。

    c言語をやっていた時の知識では、ヘッダファイルをインクルードするはずだった事例でしょうが、

    VSのC#では、どうすればいいのでしょうか?

     

    2010年9月23日 16:32

回答

すべての返信

  • 適当なところに自前で定義してください。C/C++ のヘッダを取り込むような機構は存在しません。

    2010年9月23日 16:44
  • C# では、ヘッダファイルをインクルードする仕組みがないので、ヘッダファイルを読むなりして値を直接使うしかないですね。

    こんな風に。

    http://www.pinvoke.net/default.aspx/Enums/WindowsMessages.html

    • 回答としてマーク Tolbie 2010年9月23日 17:17
    • 回答としてマークされていない Tolbie 2010年9月23日 17:17
    • 回答としてマーク 山本春海 2010年9月29日 6:38
    2010年9月23日 16:49
  • 回答ありがとうございます。

     

    しっかし、マジですか?

    マジックナンバーを使わない、というのは、かなり基本的なセオリーだった気がするんですが、こういうモノ、みなさんイチイチ定義して使ってるんですか?

    2010年9月23日 17:22
  • 理想的には、.NET Framework上のアプリケーションはあくまで.NET Framework Runtimeとだけ対話を行うことで、その下層にいるOSに依存しないことになっています。この辺りMFCがWin APIの単なるラッパークラスで必要に応じてWin APIをも操作するという点とスタンスの違いが表れています。ですので、WM_に依存する行為自体、特殊な部類に入ります。

    現実的にはWin APIを呼ばざるを得ないこともありますが…。ちなみにどのような操作をしようとしていたのでしょうか? 場合によっては適切なメソッドが用意されていることもあります。

    2010年9月23日 17:42
  • こんな時間に回答いただいて、恐縮です。

    今私がやろうとしているのは、OSがスタンバイに移行するのを阻止するという、実験です。

    いや、私のような初心者の範疇を超えているのは判ってはいるのですが、ここのWebにサンプルあるし、ちょっと試してみたかったんです。

    http://msdn.microsoft.com/ja-jp/library/cc440889.aspx

    これを試しにやってみたかったのです。

     

    でも、うまくいかない・・・

     

    2010年9月23日 17:56
  • Vista 以降ではスタンバイに関連する挙動や必要な実装が変わっていますが、それではないですか?

    .NETアプリ起動中のスタンバイ回避(Vista)

     

    2010年9月23日 18:02
  • 今現在はXPですが、できればそれ以降のOSでも実現したい機能です。

    しかし、私はVista以降を持っていないのでそれは、現時点ではしょうがない事ですね。

    ところで、ちょっと心配事なんですが、以下のコードで、Resultのアドレスを返しているつもりなんですが、

    これって、やばいですか?

    自分で書いといてなんですが、、自動変数のアドレス返しちゃってる気がするんですが。

        protected override void WndProc(ref Message m)
            {
                if ((m.Msg ==  WM_POWERBROADCAST ) & (m.WParam.ToInt32() == PBT_APMQUERYSUSPEND ))
                {
                    unsafe
                    {
                        int Result;
                       Result = 0x424D5144;
                        m.Result = (System.IntPtr)(&Result);
                        return;
                    }
                }
                base.WndProc(ref m);
            }

    2010年9月23日 18:18
  • (System.IntPtr)(&Result); では Result変数のアドレスが代入されますよ。

    m.Result = new IntPtr( 0x424D5144 ); でよくunsafeは不要です。

    2010年9月23日 18:22
  • そのとおりにしたら、動作しました。やはり、完全に理解していないと、こういうふうに恥をかきますなぁ。

    回答いただいた、すべての皆様、今夜は遅くまでありがとうございました。

     

    2010年9月23日 19:02