1.安装
建议使用 nuget 包 进行安装

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

如果您使用 vscode 或其他不支持 nuget 包管理器的编辑器或 IDE,请使用 dotnet 命令进行安装。您可以在 nuget 包网站 上查看安装命令。
当然,您也可以手动下载源代码,直接添加项目引用。😊
仓库:
2.使用命名空间
using Win32Menu;
这个项目只有一个命名空间,Win32Menu。
3.使用示例
如果您可以下载此项目(指在github仓库),
有两种类型的项目示例:Win32MenuWinFormsDemo 和 Win32MenuWpfDemo。
以下是具体的使用过程:
创建菜单栏
NativeMenu menu;
menu = new NativeMenu(){ Uid = 888,};创建菜单项
NativeMenu 中的每个对象都应该有一个唯一的 Uid。
菜单上有一些可配置的属性,如 Text、Type、Status、Checked、IsRadioCheck 和 RightJustify。
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 事件,必须执行此步骤。
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);}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()
通常不需要销毁它,除非您喜欢独立管理它。