我正在寻找使用 toastxml 操作的 Electron 通知的示例。如何检查点击操作按钮并采取行动?到目前为止,我发现我可以发出这样的通知:
const toastXmlString = `
<toast>
<audio silent="true" />
<visual>
<binding template="ToastImageAndText01">
<image id="1" src="${path.join(__dirname, 'icon.png')}" alt="img"/>
<text id="1">${app.getName()} \nHello World</text>
<text placement="attribution">This small text on bottom</text>
</binding>
</visual>
</toast>
`;
然后像这样使用
let ENotification = new Notification({ toastXml: toastXmlString });
ENotification.show();
setTimeout(function () { ENotification.close(); }, 2500);
这样做的好处是,如果您只想显示最后一个通知,这样通知就不会堆积在通知中心。
但是如何定义操作部分以便我可以在主应用程序中对它们进行操作?对于 Electron,我在任何地方都找不到这样的例子。
文档确实很少,但我终于能够通过整合多个信息源来创建一个工作示例:
通过这个,我能够创建一个带有操作的 Toast 通知,然后在单击时可以从桌面或通知中心向我的 Electron 应用程序报告,甚至在应用程序未运行时也是如此:
let notification = new Notification({
toastXml: `
<toast launch="myapp:action=navigate&contentId=351" activationType="protocol">
<visual>
<binding template="ToastGeneric">
<text>Hello world</text>
</binding>
</visual>
<actions>
<action
content="See more details"
arguments="myapp:action=viewDetails&contentId=351"
activationType="protocol"/>
<action
content="Remind me later"
arguments="myapp:action=remindlater&contentId=351"
activationType="protocol"/>
</actions>
</toast>`
})
notification.show()
现在,为了能够获得对通知本身或按钮的点击,您还需要为
myapp
注册一个 URL 协议,如上面的代码项目文章中所述。您对其进行设置,以便它调用您的 Electron 应用程序并传递 launch
/arguments
的内容作为参数。
最后,要在第一个 Electron 进程中接收返回的参数,您需要使用单实例锁定机制,因为协议激活将应用程序的新实例作为单独的进程启动。
这样做的好处是,当通知被激活(可能是从通知中心)时,也可以很容易地处理应用程序未运行的情况。
罗曼的回答帮助我完成了大部分工作。
但是在具有最新 Electron 的 Windows 11 中,应用程序在单击通知时无法正确获得焦点。我必须创建一个解决方法发送击键事件以正确允许第一个实例获取前景焦点。
这是一个实现协议通知的最小示例工作应用程序。