613 字
3 分钟
Win32Menu 教程

1.安装#

建议使用 nuget 包 进行安装

在 VisualStudio 中搜索 Win32Menu

在您的 IDE 中为相应项目打开 nuget 包管理器,搜索 Win32Menu,选择并安装它

Nuget 中的 Win32Menu

如果您使用 vscode 或其他不支持 nuget 包管理器的编辑器或 IDE,请使用 dotnet 命令进行安装。您可以在 nuget 包网站 上查看安装命令。

当然,您也可以手动下载源代码,直接添加项目引用。😊

仓库:

AuthorZiXi
/
Win32Menu
Waiting for api.github.com...
00K
0K
0K
Waiting...

2.使用命名空间#

using Win32Menu;

这个项目只有一个命名空间,Win32Menu

3.使用示例#

如果您可以下载此项目(指在github仓库),

有两种类型的项目示例:Win32MenuWinFormsDemoWin32MenuWpfDemo

以下是具体的使用过程:

创建菜单栏#

NativeMenu menu;
menu = new NativeMenu()
{
Uid = 888,
};

创建菜单项#

NativeMenu 中的每个对象都应该有一个唯一的 Uid

菜单上有一些可配置的属性,如 TextTypeStatusCheckedIsRadioCheckRightJustify

var file = new NativeMenu()
{
Uid = 1,
Text = "文件"
};
var exit = new NativeMenu()
{
Uid = 2,
Text = "退出"
}
exit.Click += (NativeMenu _, ref bool _) =>
{
Close();
};
file.AppendMenu(exit);
menu.AppendMenu(file,true);

点击事件的第二个参数有什么用?

它表示是否启用同步。同步是指将菜单项对象的状态同步到底层托管菜单的状态。

如果您更改了菜单项的状态但没有看到变化,那是因为您没有将其设置为 true。

如果不涉及状态变化,请不要修改它,特别是在窗口关闭时。

其背后的菜单也会被销毁,此时同步会导致异常!

处理 WndProc#

注意

如果您想使用 Click 事件,必须执行此步骤。

WinForm 项目
protected override void WndProc(ref Message m)
{
if (m.Msg is (int)WndProcMsgType.WmCommand)
{
if (menu is not null)
{
menu.ProcessWndProcParams(m.WParam)
}
}
base.WndProc(ref m);
}
WPF 项目
var hs = PresentationSource.FromVisual(this) as HwndSource;
if (hs is null) throw new NullReferenceException(nameof(hs));
hs.AddHook(WndProc);
private nint WndProc(nint hWnd, int msg, nint wParam, nint lParam, ref bool handled)
{
if (msg is (int)WndProcMsgType.WmCommand)
{
menu.ProcessWndProcParams(wParam);
}
return 0;
}

设置菜单#

对于窗口#

menu.SetMenu(Handle);

SetMenu 只应用于作为窗口菜单栏的 NativeMenu 对象。

对于系统菜单#

menu.SetupForSystemMenu(Handle);

使用 menu.SetupForSystemMenu(Handle);menu.SetMenu(Handle); 它们相互冲突。请不要尝试混合使用它们,否则会出现奇怪的问题。

移除菜单#

NativeMenu.SetNullMenu(Handle);

提供句柄后,菜单将被移除。

请注意,它不会被销毁。您可以按照设置菜单的原始方式重用它。

销毁菜单#

menu.Dispose()

通常不需要销毁它,除非您喜欢独立管理它。

Win32Menu 教程
https://authorzixi.github.io/posts/products/win32menu/tutorial/
作者
AuthorZiXi
发布于
2025-08-02
许可协议
CC BY-NC-SA 4.0