5


11

私はMSDNに threadを見つけました。 Winformのタイトルバーのメニュー 残念ながら、カスタムメニュー項目にイベントを登録する方法は示していません。その方法を理解することができませんでした。 以下は、新しいWindowsフォームアプリケーションにコピーして貼り付けることができるサンプルアプリです。 誰かが私のためにサンプルを完成させることができれば私はそれをいただければ幸いです。 ありがとう

システムを使用する。 System.Runtime.InteropServicesを使用します。 System.Windows.Formsを使用します。

名前空間WindowsFormsApplication1 {public部分クラスForm1:Form {public Form1(){InitializeComponent();

IntPtr hMenu = GetSystemMenu(Handle、false); if(hMenu!= IntPtr.Zero){var menuInfo = new MENUITEMINFO {cbSize =(uint)Marshal.SizeOf(typeof(MENUITEMINFO))、cch = 255、dwTypeData = "テスト項目"、fMask = 0x1 | 0x2 | 0x10、fState = 0、fType = 0x0}。

InsertMenuItem(hMenu、0、true、ref menuInfo); DrawMenuBar(ハンドル)。 }}

[DllImport( "user32.dll")] static extern IntPtr GetSystemMenu(IntPtr hWnd、bool bRevert); [DllImport( "user32.dll")] static extern bool DrawMenuBar(IntPtr hWnd); [DllImport( "user32.dll")] static extern bool InsertMenuItem(IntPtr hMenu、uint uItem、bool fByPosition、[In] ref MENUITEMINFO lpmii);

[StructLayout(LayoutKind.Sequential)] public struct MENUITEMINFO {public uint cbSize;公開uint fMask; public uint fType;公開uint fState;公のuintはwIDです。 public IntPtr hSubMenu; public IntPtr hbmpChecked; public IntPtr hbmpUnchecked; public IntPtr dwItemData;パブリック文字列dwTypeData;公共のuint cch; public IntPtr hbmpItem; }}}

3 Answer


8


あなたは WndProcメソッドをオーバーライドし、あなたの新しいメニューのIDを傍受しなければなりません。

これを試して

システムを使用する。 System.Collections.Genericを使用します。 System.ComponentModelを使用します。 System.Dataを使用します。 System.Drawingを使用します。 System.Textを使用します。 System.Windows.Formsを使用します。 System.Runtime.InteropServicesを使用します。

名前空間WindowsFormsApplication11 {パブリック部分クラスForm1:フォーム{public const Int32 WM_SYSCOMMAND = 0x112; public const Int32 MF_BYPOSITION = 0x400。 public const Int32 MYMENU1 = 1000; public const Int32 MUMENU2 = 1001;

[DllImport( "user32.dll")]プライベートstatic extern IntPtr GetSystemMenu(IntPtr hWnd、bool bRevert); [DllImport( "user32.dll")]プライベート静的extern bool

public Form1(){InitializeComponent(); }

void WndProc(参照メッセージmsg){if(msg.Msg == WM_SYSCOMMAND){switch(msg.WParam.ToInt32()){case MYMENU1:MessageBox.Show( "マイメニューからこんにちは1" ;戻るcase MUMENU2:MessageBox.Show( "こんにちは、マイメニュー2からです。");戻るデフォルトはbreakです。 base.WndProc(ref msg); }

private void Form1_Load(オブジェクトセンダ、EventArgs e){IntPtr MenuHandle = GetSystemMenu(this.Handle、false); InsertMenu(MenuHandle、5、MF_BYPOSITION、MYMENU1、 "私のメニュー1"); InsertMenu(MenuHandle、6、MF_BYPOSITION、MUMENU2、 "私のメニュー2"); }}}


3


セパレータの場合は以下を追加するだけです。

public const Int32 MF_SEPARATOR = 0x800。

そしてForm_loadでは:

InsertMenu(MenuHandle、7、MF_BYPOSITION | MF_SEPARATOR、0、string.Empty); // < - メニューセパレータを追加する


0


先に進み、WndProcを登録するために必要な要素をサンプルコードに追加しました。 これは、以前のソリューションと同じくらいコードを変更せずにWndProcを登録するという基本的な質問に答えます。 (追加されたメニューはシステムメニューの上に表示されます)。

システムを使用する。 System.Runtime.InteropServicesを使用します。 System.Windows.Formsを使用します。

名前空間WindowsFormsApplication1 {public部分クラスForm1:Form {public Form1(){InitializeComponent();

IntPtr hMenu = GetSystemMenu(Handle、false); if(hMenu!= IntPtr.Zero){var menuInfo = new MENUITEMINFO {cbSize =(uint)Marshal.SizeOf(typeof(MENUITEMINFO))、cch = 255、dwTypeData = "テスト項目"、fMask = 0x1 0x2 | 0x10、fState = 0、//メニュー項目のIDを追加します。wID = 0x1、fType = 0x0};

InsertMenuItem(hMenu、0、true、ref menuInfo); DrawMenuBar(ハンドル)。 }}

[DllImport( "user32.dll")] static extern IntPtr GetSystemMenu(IntPtr hWnd、bool bRevert); [DllImport( "user32.dll")] static extern bool DrawMenuBar(IntPtr hWnd); [DllImport( "user32.dll")] static extern bool InsertMenuItem(IntPtr hMenu、uint uItem、bool fByPosition、[In] ref MENUITEMINFO lpmii);

[StructLayout(LayoutKind.Sequential)] public struct MENUITEMINFO {public uint cbSize;公開uint fMask; public uint fType;公開uint fState;公のuintはwIDです。 public IntPtr hSubMenu; public IntPtr hbmpChecked; public IntPtr hbmpUnchecked; public IntPtr dwItemData;パブリック文字列dwTypeData;公共のuint cch; public IntPtr hbmpItem; }

// MenuのプライベートIDを追加するconst const WM_SYSCOMMAND = 0x112; // Menu protected overrideのイベントメソッドvoid WndProc(refメッセージm){base.WndProc(ref m); //(m.Msg == WM_SYSCOMMAND)//m.WParam =メニューアイテムに付けたwID

}}

}