Skip to content

持久化与单实例

窗口状态持久化

记下窗口位置/尺寸/最大化状态,下次启动恢复。API 挂 AppWindow

cpp
// 退出前 / 关闭前存
win->saveWindowState();
// 或批量存所有顶层窗口
app.saveState();

// 启动时恢复
win->restoreWindowState();
app.restoreState();

状态键由窗口 id 区分,多窗口各自恢复。

TIP

配合 onBeforeCloseAppEvent::Quit 在退出前调 saveState,启动 createWindow 后调 restoreState

单实例锁

阻止多开——第二个实例启动时,激活已有实例并退出。

cpp
auto& app = App::instance();
if (!app.requestSingleInstanceLock()) {
    return 1;   // 已有实例运行,本进程退出
}

app.onSecondInstance([](const std::vector<std::wstring>& args) {
    // 第二个实例启动了:激活主窗 / 处理命令行参数
    auto win = App::instance().focused();
    if (win) { win->show(); win->setFocus(); }
});

return app.run();

进程级生命周期

cpp
app.on(AppEvent::Quit, []{ /* 退出清理:存状态、关连接 */ });
app.onBeforeQuit([]() -> bool {
    if (hasUnsaved()) return false;   // 取消退出
    return true;
});

app.quit();   // 请求退出(走 onBeforeQuit)
app.exit();   // 立即退出

配置 / KV

简单持久化 KV(若框架版本提供,否则用外部 JSON):

cpp
// 存自定义数据
app.saveState();   // 框架内置状态
// 业务配置通常自行写 config.json(见 Paths 约定)

WARNING

业务配置(非窗口状态)建议自行落 <exe>/config/config.json,与框架窗口状态 KV 分开。

典型启动序列

cpp
int WINAPI wWinMain(HINSTANCE, HINSTANCE, PWSTR, int) {
    auto& app = App::instance();
    if (!app.requestSingleInstanceLock()) return 1;

    app.onSecondInstance(activateMain);

    auto win = app.createWindow(opts);
    app.restoreState();   // 恢复上次窗口状态

    win->onBeforeClose([] { app.saveState(); return true; });

    return app.run();
}

下一步