Windows上的电子吐司操作

juud5qan  于 2022-12-14  发布在  Windows
关注(0)|答案(2)|浏览(162)

我正在寻找一个使用toastxml操作的电子通知的例子。我如何检查和操作点击操作按钮?到目前为止,我发现我可以这样做的通知:

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);

这样做的好处是,如果你只想最后显示,这样通知就不会在通知中心堆积起来。
但是如何定义动作部分,这样我就可以在主应用程序中对它们进行操作了?我在任何地方都找不到这样的例子,电子。

6l7fqoea

6l7fqoea1#

文档确实很少,但我最终能够通过将多个信息源放在一起来创建一个工作示例:

有了这个,我就可以创建一个吐司通知,当点击它时,无论是从桌面还是从通知中心,甚至当应用程序没有运行时,它都可以报告给我的电子应用程序:

let notification = new Notification({
        toastXml: `
            <toast launch="myapp:action=navigate&amp;contentId=351" activationType="protocol">
                <visual>
                    <binding template="ToastGeneric">
                        <text>Hello world</text>
                    </binding>
                </visual>
                <actions>
                    <action
                        content="See more details"
                        arguments="myapp:action=viewDetails&amp;contentId=351"
                        activationType="protocol"/>

                    <action
                        content="Remind me later"
                        arguments="myapp:action=remindlater&amp;contentId=351"
                        activationType="protocol"/>
                </actions>
            </toast>`
    })
    notification.show()

现在,为了能够点击通知本身或按钮,您还需要为myapp注册一个URL协议,如上面的Code Project文章所述。您设置它,使其调用您的电子应用程序,并将launch/arguments的内容作为参数传递。
最后,为了在第一个Electron进程中接收回参数,您将需要使用单示例锁机制,因为协议激活会将应用程序的新示例作为单独的进程启动。
这样做的好处是,它也非常容易处理在激活通知时应用程序没有运行的情况(可能是从通知中心)。

oxcyiej7

oxcyiej72#

罗曼的回答帮助我走了大部分的路。
然而,在Windows 11与最新的电子,应用程序不能正确获得焦点时,点击通知。我不得不创建一个变通办法to send a keystroke event,以正确地允许第一个示例采取前景焦点。
这是一个minimal example working app that implements protocol notifications

相关问题