在 Windows 操作中心中未触发 notifier.on 点击事件
Posted
技术标签:
【中文标题】在 Windows 操作中心中未触发 notifier.on 点击事件【英文标题】:notifier.on click event is not fired in Windows Action Center 【发布时间】:2020-07-27 03:53:25 【问题描述】:我正在使用 node-notifier 包进行通知,但我遇到了一个问题。在 Windows 操作中心中不会触发 notifier.on 点击事件
notifier.notify(
appId: "com.electron.demo", // Absolute path (doesn't work on balloons),
title: "Alert Message",
message: "Click to view",
icon: path.join(__dirname, 'msicon.png'),
wait: true,
timeout: false,
id: "demo app"
,
function(err, response)
// Response is response from notification
if (err)
reject(err);
else
resolve(response);
);
notifier.on("click", function(notifierObject, options, event)
// Triggers if `wait: true` and user clicks notification
var request = new sql.Request();
let username = userName;
request.query("update alerts.dbo.groupmessages set isRead = 1\
where pk = '"+ recordset.recordset[i].pk + "'\
and userFK = (select pk from alerts.dbo.users where username = '"+ username + "')\
and groupFK = (select groupFK from alerts.dbo.users where username = '"+ username + "')", function (err, recordset)
if (err) throw err
console.log(err, recordset, 'User shit');
);
function createWindow()
// Create the browser window.
win = new BrowserWindow(
width: 400,
height: 400,
frame: false,
webPreferences:
nodeIntegration: true
);
// and load the index.html of the app.
ejse.data('message', recordset.recordset[i].message);
win.loadFile('index.ejs')
createWindow();
);
);
);
notifier.on 点击事件不会仅在 Windows 操作中心触发。请让我知道原因和解决方案。谢谢。
【问题讨论】:
您需要使用电子Notifications
从应用程序触发操作系统通知。 electronjs.org/docs/api/notification#notification
@namila007 电子通知不会留在行动中心
【参考方案1】:
Action Center 需要在本机代码中单独实现,而 node-notifier 没有。
您可以尝试 node-powertoast 并使用 onActivated 回调:
npm i node-powertoast
const toast = require('powertoast');
toast(
title: "Hello",
message: "world",
callback:
timeout: 5000, //keep-a-live in ms
onActivated: ()=> console.log("activated") ,
onDismissed: (reason)=> console.log(reason)
)
.then(()=> console.log("Notified")
.catch(err => console.error(err));
至于原因: 您可以看到对于其他项目,这是一项重大任务,例如,以下项目似乎让 Action Center 支持陷入困境 2 年了:https://github.com/mohabouje/WinToast/issues/35 试图自己实施它的人似乎已经陷入困境,并且已经难以正确实施。 只是很难做到。
【讨论】:
不幸的是node-powertoast
只回答了关于如何显示通知的问题。不是如何获得对点击的反应。从这个意义上说,它并不比节点通知器或标准电子通知更好。您可以使用它做的最好的事情是指定自定义协议,但您也可以使用标准 Electron 通知来做到这一点 - 不需要 lib。【参考方案2】:
通知没有获得点击,因为并非所有操作中心要求都得到满足。
通常,Windows 通知具有三种激活类型:foreground
、background
和 protocol
。
在任何情况下,您都需要具备以下条件:
在开始菜单中有一个带有AppUserModelId
属性的快捷方式。请咨询您的安装人员如何操作或使用shell.readShortcutLink
和shell.writeShortcutLink
Electron API。具体来说,WiX 允许您在选项中指定 appUserModelId
和 toastActivatorClsid
。
在应用中指定AppUserModelId
。
app.setAppUserModelId('AppUserModelId');
注册一个自定义协议并对其做出一些反应。比如这样:
app.setAsDefaultProtocolClient('example');
要使用foreground
或background
,您需要:
在开始菜单中有一个带有ToastActivatorCLSID
属性的快捷方式。请参阅上面的操作方法。
使用 electron-windows-interactive-notifications 之类的项目,使用指定的较早 ToastActivatorCLSID
和您选择的自定义协议注册 COM 服务器并调用:
registerComServer();
registerActivator();
我不会深入了解如何对自定义协议做出反应,但您需要解析命令行参数以搜索 example:
,如果应用程序已经启动,还需要在 second-instance
挂钩中找到它。
要使用protocol
,无需额外操作。
之后,即使是标准的 Electron 通知也会从 Action Center 获得点击。
但是如何使用这些协议并获得功能丰富的通知呢? Electron 允许你直接指定 toastXml!
假设这是您的通知。即使从操作中心点击它也会打开https://google.com
。
const notification = new Notification(
toastXml: `
<toast launch="https://google.com" activationType="protocol">
<visual>
<binding template="ToastGeneric">
<text>Wonderman meets Superwoman</text>
<text>In the eve of the new millennium, Wonderman challenges Superwoman to a bliniking contest.</text>
<text placement="attribution">Mars Press</text>
</binding>
</visual>
</toast>
`,
);
notification.show();
此通知只会打开 Google。您可以通过Notification Visualizer App获得更多想法
【讨论】:
以上是关于在 Windows 操作中心中未触发 notifier.on 点击事件的主要内容,如果未能解决你的问题,请参考以下文章
在 jQueryMobile 中未触发 jQuery 单击事件