Skip to content

系统集成

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);

下一步