在 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 通知具有三种激活类型:foregroundbackgroundprotocol

在任何情况下,您都需要具备以下条件:

    在开始菜单中有一个带有AppUserModelId 属性的快捷方式。请咨询您的安装人员如何操作或使用shell.readShortcutLinkshell.writeShortcutLink Electron API。具体来说,WiX 允许您在选项中指定 appUserModelIdtoastActivatorClsid

    在应用中指定AppUserModelId

     app.setAppUserModelId('AppUserModelId');
    

    注册一个自定义协议并对其做出一些反应。比如这样:

     app.setAsDefaultProtocolClient('example');
    

要使用foregroundbackground,您需要:

    在开始菜单中有一个带有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 点击​​事件的主要内容,如果未能解决你的问题,请参考以下文章

Ansible之handler和notify结合触发条件

在 jQueryMobile 中未触发 jQuery 单击事件

ansible-playbook 之handlers和notify

Windows NT WinLogon Notify

在 Android 手机中未触发 keyPress 事件

Cordova 设备在 iOS 中未触发