如何制作出现在其他窗口/应用程序前面的闪亮或 javascript 警报

Posted

技术标签:

【中文标题】如何制作出现在其他窗口/应用程序前面的闪亮或 javascript 警报【英文标题】:How to make a shiny or javascript alert that appears in front of other windows/apps 【发布时间】:2021-12-13 03:34:13 【问题描述】:

我正在编写一个应用程序,该应用程序将用于将大量照片(通常一次数万张)从 SD 卡复制到外部硬盘驱动器,人们在做其他工作时将在后台运行这些照片。我想在文件复制完成时通知用户,这样他们就不必继续检查应用程序。我过去使用过shinyalert(),并且我也知道使用 javascript 函数来发送警报(这是我发现的:

$( document ).ready(function() 
  Shiny.addCustomMessageHandler('alert', function(message) 
    alert(message)
  )
);

)。但是,那些只在应用程序打开时出现,我想要一些会在任何其他窗口前面弹出的东西。我的解决方案是使用 system2() 调用一个 powershell 脚本,我从这个页面借用了这个脚本:https://gist.github.com/Windos/9aa6a684ac583e0d38a8fa68196bc2dc#file-toast-notification-not-working-on-windows-fall-creators-update-ps1 并更改了警报的实际文本。

powershell 脚本运行良好,但我担心如果用户使用不同版本的 Windows,它将无法运行。 (该应用程序旨在作为一个包部署并在用户计算机上本地运行,而不是从闪亮的服务器上运行)。

shinyalert 或 javascript 警报中是否有任何选项或设置可以更改以使它们在其他窗口前可见?和/或 powershell 脚本选项是否足够强大,可以在不同的计算机上运行?

谢谢!

【问题讨论】:

【参考方案1】:

更好的选择是使用浏览器通知。这将触发浏览器在所有窗口和所有其他软件程序前发送通知。此外,这适用于所有平台,无论是什么版本的 Windows、Linux 或 MacOS,只要他们有现代浏览器,如 Chrome、Firefox、Edge 或其他,它都可以工作。

这是怎么做的:

$( document ).ready(function() 
  Shiny.addCustomMessageHandler('alert', function(data) 
    Notification.requestPermission().then(function() 
      new Notification(data.msg);
    );
  )
);

在您的闪亮服务器中,完成您的流程后,添加此

  session$sendCustomMessage(
    type = 'alert',
    message = list(
      msg = "my message"
    )
  )

完整代码:

library(shiny)

ui <- fluidPage(
  tags$script(
      '
      $( document ).ready(function() 
        Shiny.addCustomMessageHandler(\'alert\', function(data) 
          Notification.requestPermission().then(function() 
            new Notification(data.msg);
          );
        )
      );
      '
  )
)

server <- function(input, output, session) 
  observe(
      # do some thing 
      Sys.sleep(2)
      session$sendCustomMessage(
          type = 'alert',
          message = list(
              msg = "my message"
          )
      )
  )


shinyApp(ui, server)

第一次会询问用户是否允许,一旦他们接受,就会显示通知。

在 Linux 上显示时,Windows 可能有点不同,但仍应高于所有程序。

【讨论】:

以上是关于如何制作出现在其他窗口/应用程序前面的闪亮或 javascript 警报的主要内容,如果未能解决你的问题,请参考以下文章

如何在闪亮或 flexdahsboard 中制作用户选择的变量图表?

如何保存在闪亮的应用程序中制作的图

QTableWidget子窗口如何放在父窗口前面或父窗口下面?

如何在闪亮的应用程序中制作kable table reactive()?闪亮+ kable

不允许从闪亮的输出对象中读取对象?

R:快速启动的 GUI(闪亮的替代品?)