我有一个WinForms应用程序,我想在用户点击窗口左上角(图标)或按ALT + SPACE时打开的菜单中添加一个菜单项。
表单只显示MainMenu和ContextMenu,但没有图标菜单或类似的东西。有没有一种简单的方法可以在WinForms应用程序上修改它?
我正在谈论这个菜单,我想添加一个简单的“关于”条目,只是为了让人们从应用程序中检查版本和URL。通常的用户界面中没有好的地方(没有主菜单)。
Alt+Space Menu http://img513.imageshack.us/img513/3162/altspacemenu.jpg
答案 0 :(得分:6)
将FormBorderStyle设置为除“None”以外的任何内容时,此菜单将添加到表单中。更改表单边框样式时,将调用名为AdjustSystemMenu的例程。此例程使用GetSystemMenu方法检索SystemMenu?来自某个地方。 '某处'就是问题所在。在任何可以访问的地方似乎都没有SystemMenu对象。
编辑: 刚刚找到这个link,看起来它可能会做你想要的。
public partial class Form1 : Form
{
#region Win32 API Stuff
// Define the Win32 API methods we are going to use
[DllImport("user32.dll")]
private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
[DllImport("user32.dll")]
private static extern bool InsertMenu(IntPtr hMenu, Int32 wPosition, Int32 wFlags, Int32 wIDNewItem, string lpNewItem);
/// Define our Constants we will use
public const Int32 WM_SYSCOMMAND = 0x112;
public const Int32 MF_SEPARATOR = 0x800;
public const Int32 MF_BYPOSITION = 0x400;
public const Int32 MF_STRING = 0x0;
#endregion
// The constants we'll use to identify our custom system menu items
public const Int32 _SettingsSysMenuID = 1000;
public const Int32 _AboutSysMenuID = 1001;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
/// Get the Handle for the Forms System Menu
IntPtr systemMenuHandle = GetSystemMenu(this.Handle, false);
/// Create our new System Menu items just before the Close menu item
InsertMenu(systemMenuHandle, 5, MF_BYPOSITION | MF_SEPARATOR, 0, string.Empty); // <-- Add a menu seperator
InsertMenu(systemMenuHandle, 6, MF_BYPOSITION, _SettingsSysMenuID, "Settings...");
InsertMenu(systemMenuHandle, 7, MF_BYPOSITION, _AboutSysMenuID, "About...");
}
protected override void WndProc(ref Message m)
{
// Check if a System Command has been executed
if (m.Msg == WM_SYSCOMMAND)
{
// Execute the appropriate code for the System Menu item that was clicked
switch (m.WParam.ToInt32())
{
case _SettingsSysMenuID:
MessageBox.Show("\"Settings\" was clicked");
break;
case _AboutSysMenuID:
MessageBox.Show("\"About\" was clicked");
break;
}
}
base.WndProc(ref m);
}
}
答案 1 :(得分:3)
有一组Windows API函数可以获取和操作该菜单。
对于C#,请查看此示例:
http://www.codeguru.com/csharp/csharp/cs_misc/userinterface/article.php/c9327
答案 2 :(得分:0)
AFAIK没有.Net方式来做到这一点。
要启用此功能,您必须转到Windows API,我建议您查看WinMain和WndProc