系统集成
App 统一封装 Win32 系统能力:菜单、托盘、全局快捷键、对话框、shell、剪贴板、显示器。
菜单(Menu)
Win32 弹出菜单,支持子菜单 / 可选项 / 单选项 / 图标:
cpp
auto m = std::make_shared<Menu>();
m->addItem(L"打开", [](){ /* ... */ });
m->addSeparator();
m->addCheckable(L"自动保存", true, [](bool checked){ /* ... */ });
m->addSubmenu(L"最近", subMenu);
m->addRadio(L"主题", {L"亮", L"暗"}, 0, [](int idx){ /* ... */ });
m->setIcon(item, L"IDI_ICON1");
m->popup(hwnd); // 在指定窗口弹出运行期可改:setEnabled / setChecked / setLabel。
托盘(Tray)
系统托盘图标 + 右键菜单 + 气泡通知:
cpp
auto tray = app.createTray();
tray->setIcon(L"IDI_TRAY");
tray->setTooltip(L"我的应用");
tray->setMenu(menu);
tray->showBalloon(L"标题", L"内容");
tray->onClick([](){ /* 左键 */ });
tray->onDoubleClick([](){ /* 双击 */ });
app.setQuitToTray(true); // 关闭按钮最小化到托盘而非退出全局快捷键
注册系统级热键(即使应用不在前台):
cpp
app.registerHotKey(Modifiers::Ctrl | Modifiers::Alt, VK_F9);
app.onHotKey([](WORD key, WORD mods) {
// 触发
});
// 注销
app.unregisterHotKey(Modifiers::Ctrl | Modifiers::Alt, VK_F9);TIP
全局热键占系统资源,不用时及时 unregisterHotKey。
对话框(dialog)
cpp
app.showMessageBox(L"标题", L"内容", MB_OK | MB_ICONINFORMATION);
auto paths = app.showOpenDialog({
.title = L"选择文件",
.filters = {{L"图片", L"*.png;*.jpg"}},
.multiSelect = true
});
auto saveTo = app.showSaveDialog({
.title = L"保存到",
.defaultExt = L"txt"
});shell
cpp
app.openExternal(L"https://github.com"); // 用系统默认浏览器/程序打开
app.showItemInFolder(L"E:\\path\\file.txt"); // 资源管理器定位文件剪贴板
cpp
app.clipboardWriteText(L"hello");
std::wstring s = app.clipboardReadText();显示器(Display)
cpp
auto pri = app.primaryDisplay(); // {x,y,width,height,workArea,scale}
auto all = app.allDisplays(); // 所有显示器用于窗口初始定位、多屏平铺(配合 win->moveToDisplay)。
组合示例
托盘右键菜单 + 双击显窗 + 最小化驻留:
cpp
auto menu = std::make_shared<Menu>();
menu->addItem(L"显示", [w=winWeak]{ /* show */ });
menu->addSeparator();
menu->addItem(L"退出", []{ App::instance().quit(); });
auto tray = app.createTray();
tray->setIcon(L"IDI_TRAY");
tray->setTooltip(L"my app");
tray->setMenu(menu);
tray->onDoubleClick([]{ /* 激活主窗 */ });
app.setQuitToTray(true);