Examples
Copy-paste-ready snippets covering windows / IPC / tray / hotkeys / context menus / dialogs / drag-drop / YAML. Snippets live inside 类 启动类 <公开 基础类 = 程序类> with the JadeView module referenced and these declared:
变量 Jade <类型 = JadeView>
变量 主窗口ID <类型 = 整数>Receive-event methods (
JadeView_应用就绪, etc.) can be generated by clicking the lightning icon next to theJadevariable — no hand-written signatures needed.
Complete Desktop App Skeleton
Startup method (subscribe special events → initialize → register IPC channels → message loop):
方法 启动方法 <公开 类型 = 整数>
{
// interceptable / special events are subscribed manually before 初始化
Jade.订阅事件 (订阅_视图事件.请求新窗口)
Jade.订阅事件 (订阅_视图事件.文件拖放)
如果 (Jade.初始化 (真, "", "", "JadeView Demo", "com.jadeview.demo", 真) == 假)
{
返回 (0)
}
Jade.置IPC频道回调 (本对象, "ipcChannelMessageCallback")
Jade.注册IPC通道 ("ipc-echo")
Jade.注册IPC通道 ("set-theme")
Jade.注册IPC通道 ("minimize")
Jade.运行消息循环 ()
返回 (1)
}Load the local frontend and create the main window on app-ready (Mica + title-overlay):
方法 JadeView_应用就绪 <接收事件 类型 = 整数>
参数 来源对象 <类型 = JadeView>
参数 标记值 <类型 = 整数>
参数 窗口ID <类型 = 整数>
参数 数据 <类型 = 文本型>
{
如果 (来源对象 == Jade)
{
变量 窗口选项 <类型 = JadeWindowOptions>
变量 视图选项 <类型 = JadeViewOptions>
窗口选项.标题 = "JadeView VolDP Demo"
窗口选项.左边 = -1
窗口选项.顶边 = -1
窗口选项.宽度 = 1400
窗口选项.高度 = 900
窗口选项.可调整大小 = 真
窗口选项.使用页面图标 = 真
窗口选项.允许最小化 = 真
窗口选项.允许最大化 = 真
窗口选项.透明窗口 = 真
窗口选项.边框风格 = 窗口边框样式.标题覆盖
窗口选项.主题 = 窗口主题.跟随系统
视图选项.允许全屏 = 真
视图选项.自动播放 = 真
变量 本地资源地址 <类型 = 文本型>
本地资源地址 = Jade.置协议服务目录 (取运行目录 () + "web")
主窗口ID = Jade.创建窗口 (本地资源地址, 0, 窗口选项, 视图选项)
}
返回 (0)
}Apply the first-frame backdrop once the window actually exists:
方法 JadeView_窗口已创建 <接收事件 类型 = 整数>
参数 来源对象 <类型 = JadeView>
参数 标记值 <类型 = 整数>
参数 窗口ID <类型 = 整数>
{
如果 (来源对象 == Jade)
{
如果真 (Jade.系统.是否为Win11 ())
{
Jade.窗口.置材质 (窗口ID, 窗口材质.云母)
}
}
返回 (0)
}IPC Replies & JSON Payload Parsing
方法 IPC频道消息 <公开 类型 = 文本型 @强制输出 = 真 @输出名 = "ipcChannelMessageCallback">
参数 通道名 <类型 = 文本型>
参数 窗口ID <类型 = 整数>
参数 数据 <类型 = 文本型>
{
变量 数据解构 <类型 = json_object>
数据解构.创建自文本 (数据)
如果 (通道名 == "ipc-echo")
{
返回 (数据) // echo
}
如果 (通道名 == "set-theme")
{
// frontend payload: {"mode": "Dark"}
Jade.窗口.置主题 (窗口ID, 数据解构.取文本 ("mode", "System"))
返回 ("theme changed")
}
如果 (通道名 == "minimize")
{
Jade.窗口.最小化 (窗口ID)
返回 ("minimized")
}
返回 ("unknown channel: " + 通道名)
}Interceptable Event: External Links to the System Browser
方法 JadeView_请求新窗口 <接收事件 类型 = 整数 注释 = "Return 1 to intercept, 0 to pass.">
参数 来源对象 <类型 = JadeView>
参数 标记值 <类型 = 整数>
参数 窗口ID <类型 = 整数>
参数 地址 <类型 = 文本型>
{
如果 (来源对象 == Jade)
{
打开指定网址 (地址, ) // hand to the default browser
返回 (1) // block the in-WebView popup
}
返回 (0)
}File Drag-Drop: Forward + Synchronous enter Rejection
变量 拒绝拖入 <类型 = 逻辑型>
方法 JadeView_文件拖放 <接收事件 类型 = 整数 注释 = "Manual subscription required; enter/drop phases are interceptable.">
参数 来源对象 <类型 = JadeView>
参数 标记值 <类型 = 整数>
参数 窗口ID <类型 = 整数>
参数 数据 <类型 = 文本型>
{
如果 (来源对象 == Jade)
{
// forward enter/over/drop/leave to the page (it stops receiving native drops
// once the host takes over)
Jade.发送IPC消息 (窗口ID, "drag-drop", 数据)
如果真 (拒绝拖入)
{
变量 拖放数据 <类型 = json_object>
如果真 (拖放数据.创建自文本 (数据))
{
如果真 (拖放数据.取文本 ("type", "") == "enter")
{
返回 (1) // reject at enter: cursor turns "no", no drop will follow
}
}
}
}
返回 (0)
}Async Dialogs
方法 对话框结果回调 <公开 类型 = 整数 @强制输出 = 真 @输出名 = "dialogBoxCallback">
参数 数据文本 <类型 = 文本型>
{
// push the result JSON to the page (or handle it in VolDP directly)
Jade.发送IPC消息 (主窗口ID, "dialog-result", 数据文本)
返回 (0)
}// open file (multi-select)
Jade.显示打开文件对话框_异步 (主窗口ID, "Open File", "", "",
"[{\"name\":\"All files\",\"extensions\":[\"*\"]}]",
"openFile,multiSelections", 本对象, "dialogBoxCallback")
// message box (OK/Cancel, result {"response":0})
Jade.显示消息框_异步 (主窗口ID, "Confirm", "Continue?", "",
"[\"确定\",\"取消\"]", 0, 1, 提示框类型.询问, 本对象, "dialogBoxCallback")System Tray: Icon + Menu + Key Dispatch
// create the tray (icon + tooltip + menu with submenu / divider / disabled / dangerous items)
如果真 (Jade.托盘.创建 ())
{
Jade.托盘.置图标 (取运行目录 () + "web\\tray.ico")
Jade.托盘.置提示 ("JadeView VolDP Demo")
Jade.托盘.添加菜单项 (托盘菜单项类型.普通项, "show", "Show window", "", 假, 假)
Jade.托盘.添加菜单项 (托盘菜单项类型.分隔线, "sep1", "", "", 假, 假)
Jade.托盘.添加菜单项 (托盘菜单项类型.子菜单, "sub", "More", "", 假, 假)
Jade.托盘.添加菜单项 (托盘菜单项类型.普通项, "flash", "Flash taskbar", "sub", 假, 假)
Jade.托盘.添加菜单项 (托盘菜单项类型.分隔线, "sep2", "", "", 假, 假)
Jade.托盘.添加菜单项 (托盘菜单项类型.普通项, "exit", "Exit", "", 假, 真) // dangerous = red
}方法 JadeView_托盘交互事件 <接收事件 类型 = 整数 注释 = "Left click brings the window back.">
参数 来源对象 <类型 = JadeView>
参数 标记值 <类型 = 整数>
参数 事件类型 <类型 = 文本型>
参数 托盘ID <类型 = 整数>
{
如果 (来源对象 == Jade)
{
如果真 (事件类型 == 托盘事件类型.左键点击)
{
Jade.窗口.置可视 (主窗口ID, 真)
Jade.窗口.置焦点 (主窗口ID)
}
}
返回 (0)
}
方法 JadeView_托盘菜单命令事件 <接收事件 类型 = 整数 注释 = "Dispatch clicks by key name.">
参数 来源对象 <类型 = JadeView>
参数 标记值 <类型 = 整数>
参数 托盘ID <类型 = 整数>
参数 键名 <类型 = 文本型>
参数 项目ID <类型 = 整数>
参数 项目类型 <类型 = 文本型>
参数 已选中 <类型 = 逻辑型>
参数 风险项目 <类型 = 逻辑型>
{
如果 (来源对象 == Jade)
{
如果 (键名 == "show")
{
Jade.窗口.置可视 (主窗口ID, 真)
Jade.窗口.置焦点 (主窗口ID)
}
如果 (键名 == "flash")
{
Jade.窗口.置任务栏闪烁 (主窗口ID, 10)
}
如果 (键名 == "exit")
{
Jade.托盘.销毁 ()
Jade.退出程序 ()
}
}
返回 (0)
}Global Hotkey: Ctrl+Alt+J Recalls the Window
变量 已注册热键ID <类型 = 整数>
// register (74 = virtual-key code of 'J')
已注册热键ID = Jade.注册全局热键 (位或 (热键功能键.Control, 热键功能键.Alt), 74)方法 JadeView_全局热键 <接收事件 类型 = 整数 注释 = "Fires even without focus.">
参数 来源对象 <类型 = JadeView>
参数 标记值 <类型 = 整数>
参数 窗口ID <类型 = 整数>
参数 热键ID <类型 = 整数>
参数 修饰键 <类型 = 整数>
参数 虚拟键码 <类型 = 整数>
{
如果 (来源对象 == Jade)
{
Jade.窗口.置可视 (主窗口ID, 真)
Jade.窗口.置焦点 (主窗口ID)
}
返回 (0)
}Class member variables must not share a name with event parameters (the member above is 已注册热键ID, not 热键ID) — a clash produces a "duplicate name" compile error.
Context-Menu Takeover: Native + Custom Items
变量 菜单_复制 <类型 = 整数>
变量 菜单_刷新 <类型 = 整数>
变量 菜单_关于 <类型 = 整数>
// subscribe in the startup method (before 初始化 is fine too)
Jade.订阅事件 (订阅_视图事件.菜单事件)
Jade.订阅事件 (订阅_视图事件.自定义菜单事件)方法 JadeView_菜单事件回调 <接收事件 类型 = 整数 注释 = "Right-click: create the items, call 置显示, WebView2 shows the native menu.">
参数 来源对象 <类型 = JadeView>
参数 标记值 <类型 = 整数>
参数 窗口ID <类型 = 整数>
参数 X坐标 <类型 = 整数>
参数 Y坐标 <类型 = 整数>
参数 菜单场景 <类型 = 文本型>
参数 默认菜单项列表 <类型 = 文本型>
参数 数据 <类型 = 文本型>
{
如果 (来源对象 == Jade)
{
// rebuild on every right-click (destroy last round's items first)
如果真 (菜单_复制 > 0)
{
Jade.菜单.销毁 (菜单_复制)
Jade.菜单.销毁 (菜单_刷新)
Jade.菜单.销毁 (菜单_关于)
}
菜单_复制 = Jade.菜单.创建 (原生菜单项.复制, 菜单类型.默认菜单项, 0, 0)
菜单_刷新 = Jade.菜单.创建 (原生菜单项.刷新, 菜单类型.默认菜单项, 0, 0)
菜单_关于 = Jade.菜单.创建 ("About this app", 菜单类型.命令, 0, 1001)
变量 菜单列表 <类型 = 整数数组类>
菜单列表.加入成员 (菜单_复制)
菜单列表.加入成员 (菜单_刷新)
菜单列表.加入成员 (菜单_关于)
Jade.菜单.置显示 (窗口ID, 菜单列表)
}
返回 (0)
}
方法 JadeView_自定义菜单事件 <接收事件 类型 = 整数 注释 = "数据 = the item_id passed at creation.">
参数 来源对象 <类型 = JadeView>
参数 标记值 <类型 = 整数>
参数 窗口ID <类型 = 整数>
参数 数据 <类型 = 文本型>
{
如果 (来源对象 == Jade)
{
如果真 (数据 == "1001")
{
Jade.打开关于对话框 (窗口ID)
}
}
返回 (0)
}Run JavaScript and Fetch the Result by Request Id
// submit the script and remember the request id
变量 请求ID <类型 = 整数>
请求ID = Jade.执行脚本 (主窗口ID, "document.title")方法 JadeView_脚本执行结果 <接收事件 类型 = 整数 注释 = "数据 is JSON containing id and result.">
参数 来源对象 <类型 = JadeView>
参数 标记值 <类型 = 整数>
参数 窗口ID <类型 = 整数>
参数 数据 <类型 = 文本型>
{
如果 (来源对象 == Jade)
{
变量 结果 <类型 = json_object>
如果真 (结果.创建自文本 (数据))
{
调试输出 ("request", 结果.取整数 ("id", 0), "result:", 结果.取文本 ("result", ""))
}
}
返回 (0)
}YAML Config Persistence
// 写: auto-parses ("42" stores a number); 写字符串: force plain string
Jade.YAML.写 ("config", "app.name", "My App")
Jade.YAML.写 ("config", "window.width", "1200")
Jade.YAML.写字符串 ("config", "raw.code", "12345")
// read
变量 名称 <类型 = 文本型>
名称 = Jade.YAML.读 ("config", "app.name")
// key-path operations
如果真 (Jade.YAML.是否存在 ("config", "window.width"))
{
调试输出 ("keys:", Jade.YAML.列出键 ("config", "")) // all root keys
调试输出 ("len:", Jade.YAML.取长度 ("config", "app"))
}
Jade.YAML.删除 ("config", "raw.code")System Capabilities at a Glance
// clipboard
Jade.系统.置剪贴板文本 ("copied content")
调试输出 (Jade.系统.取剪贴板文本 ())
// system notification with a button (clicks arrive via the 通知动作 event)
变量 通知选项 <类型 = JadeNotificationOptions>
通知选项.标题 = "Task finished"
通知选项.正文 = "The files have been processed"
通知选项.按钮1 = "Open folder"
Jade.显示通知 (通知选项)
// NTP network time (independent of the local clock; -1 on failure)
调试输出 ("UTC ms:", Jade.系统.取网络时间戳 ())
// file icon extraction (returns a jade:// URL usable in a frontend <img>)
变量 图标地址 <类型 = 文本型>
图标地址 = Jade.系统.取文件图标 ("C:\\Windows\\explorer.exe", 64, 主窗口ID, 0)
// taskbar progress (with 进度条状态类型)
Jade.窗口.置任务栏进度 (主窗口ID, 60, 进度条状态类型.正常)
// login autostart
Jade.系统.置开机自启 (真, "--autostart")