事件系统
每窗口一个 EventBus,两类事件:WindowEvent(窗口自身)与 PageEvent(WebView2 页面)。
WindowEvent
窗口级事件,带 payload 结构体。
cpp
win->on(WindowEvent::Resize, [](const ResizePayload& p) {
// p.w, p.h
});
win->on(WindowEvent::Move, [](const MovePayload& p) {
// p.x, p.y(去抖)
});
win->on(WindowEvent::Close, []([](){} /* 无 payload 或回调 */ {});常见 WindowEvent:
| 事件 | payload | 触发 |
|---|---|---|
Resize | ResizePayload{w,h} | 尺寸变(去抖) |
Move | MovePayload{x,y} | 位置变(去抖) |
Close | — | 关闭前 |
Focus / Blur | — | 获得/失焦 |
Minimize / Restore / Maximize | — | 状态变 |
Show / Hide | — | 显隐 |
去抖
Resize / Move 自带去抖——拖动过程不狂触发,停手后派发一次。避免拖拽时业务回调爆炸。
PageEvent
WebView2 页面级事件。
cpp
win->on(PageEvent::DidFinishLoad, []() {
// 页面加载完成,可安全 executeJavaScript / call
});
win->on(PageEvent::TitleChanged, [](const TitlePayload& p) {
// p.title
});常见 PageEvent:
| 事件 | 说明 |
|---|---|
DidFinishLoad | 页面加载完成(注入 runtime、调 JS 的安全时机) |
TitleChanged | 页面标题变 |
NavigationStarting / NavigationCompleted | 导航起止 |
onBeforeClose
关闭是特殊事件——可取消:
cpp
win->onBeforeClose([]() -> bool {
if (hasUnsavedWork()) {
promptSave();
return false; // 阻止本次关闭
}
return true; // 放行
});返回 false 阻止窗口关闭,用于未保存提示、最小化到托盘等。
App 级事件
进程级生命周期 + 自动更新:
cpp
app.on(AppEvent::Quit, []() { /* 退出前清理 */ });
app.onBeforeQuit([]() -> bool {
return allowQuit(); // false 取消退出
});
// 自动更新事件
app.on(AppEvent::UpdateAvailable, [](const UpdateInfo& info) {
// info.version / info.url / info.releaseNotes
});
app.on(AppEvent::UpdateDownloadProgress, [](const UpdateProgress& p) {
// p.percent / p.bytesPerSecond
});
app.on(AppEvent::UpdateDownloaded, [](const UpdateInfo& info) {
// info.filePath = 本地 exe 路径,可调 quitAndInstall()
});
app.on(AppEvent::UpdateError, [](const std::wstring& err) {
// 显示错误
});| 事件 | payload | 说明 |
|---|---|---|
Ready | — | app 就绪 |
Quit | — | 退出前 |
ThemeChanged | — | 系统主题变 |
UpdateChecking | — | 开始检查更新 |
UpdateAvailable | UpdateInfo | 新版本可用 |
UpdateNotAvailable | — | 已是最新 |
UpdateDownloadProgress | UpdateProgress | 下载进度 |
UpdateDownloaded | UpdateInfo | 下载完成 |
UpdateError | wstring | 出错 |
线程安全
WARNING
EventBus 仅 UI 线程安全。所有事件回调在 UI 线程派发。跨线程想触发事件,用 App 投递回 UI 线程,勿直接调 EventBus。