DOBON.NET DOBON.NETプログラミング掲示板過去ログ

タイトルバーのコンテキストメニューについて

環境/言語:[Windows XP, C#, .NET Framework2.0]
分類:[.NET]

フォームのタイトルバーを右クリックすると表れるコンテキストメニューに
オリジナルの項目(バージョン情報など)を追加したいと思っています。

メニュー項目の追加は、Win32APIを利用することで実現できたのですが、
追加した項目を選択したときに行いたい処理をどのように定義すれば
よいのかわからず困っています。

実装方法について、どなたかご存知の方がいましたら、ご教授願います。

参考情報として、メニュー項目を追加する際のサンプルを記載します。
下記のコードについても、もし方法が間違えているようでしたら、
ご指摘いただけると幸いです。

    public partial class Form1 : Form
    {
        // Win32 APIのインポート
        [DllImport("USER32.DLL")]
        private static extern IntPtr GetSystemMenu(IntPtr hWnd, UInt32 bRevert);
        [DllImport("USER32.DLL")]
        private static extern bool AppendMenu(IntPtr hMenu, UInt32 uFlags, UInt32 uIDNewItem, string lpNewItem);

        // オリジナルメニューを追加するための値
        private const UInt32 MF_BYCOMMAND = 0x00000000;
        private const UInt32 MF_STRING = 0x00000000;
        private const UInt32 MF_SEPARATOR = 0x00000800;

        public Form1()
        {
            InitializeComponent();

            // タイトルバーのコンテキストメニューを取得
            IntPtr hMenu = GetSystemMenu(this.Handle, 0);

            // セパレータとメニューを追加
            AppendMenu(hMenu, MF_SEPARATOR, 0, string.Empty);
            AppendMenu(hMenu, MF_STRING, MF_BYCOMMAND, "バージョン情報");

        }
    }

以上、よろしくお願いいたします。
// GetSystemMenu が出てくれば後は芋づる式に情報が出てくると思うんですが……。
メニュー項目選択時に WM_SYSCOMMAND メッセージがフォームに送信されるので、それを捕まえて処理することになります。
WinForm では、Form の WndProc をオーバーライドして処理を追加します。
WM_SYSCOMMAND の実際の値とかは検索するなりしてください。
■No24479に返信(みゃさんの記事)
> private const UInt32 MF_BYCOMMAND = 0x00000000;
> private const UInt32 MF_STRING = 0x00000000;
> private const UInt32 MF_SEPARATOR = 0x00000800;

protected override void WndProc(ref Message m)
{
 const int WM_SYSCOMMAND = 0x112;
 if (m.Msg == WM_SYSCOMMAND)
 {
  if (unchecked((uint)m.WParam) == MF_BYCOMMAND)
  {
   MessageBox.Show(Application.ProductVersion.ToString(),
    "バージョン情報", MessageBoxButtons.OK,
    MessageBoxIcon.Information);
  }
 }
 base.WndProc(ref m);
}
Hongliangさん、魔界の仮面弁士さん

早速のコメントありがとうございました。
アドバイスの通り、WndProc をオーバーライドすることでやりたかったことが実現できました。
(というより、魔界の仮面弁士さんに書いていただいたコードでできました!)

レスの早さからしても、WndProc のオーバーライドはごくごく基本的なことなのでしょうね(^^;)
まだまだ勉強不足です、精進します。

本件、疑問点を解決していただくことができましたのでクローズさせていただきます。
ありがとうございました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板