为了账号安全,请及时绑定邮箱和手机立即绑定

如何检测键盘按键上的点击事件:播放/暂停 (▶/❚❚)、Electron Js 上的下一个和上一个

如何检测键盘按键上的点击事件:播放/暂停 (▶/❚❚)、Electron Js 上的下一个和上一个

萧十郎 2023-07-20 10:51:21
根据此JavaScript 检测播放/暂停键盘(虚拟)键,可以使用 JavaScript 检测播放/暂停、下一个和上一个(硬件媒体键处理)键,但仅限于 Chrome。电子中有类似的东西吗?PS:它是用于音频播放器的。
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

我正在回答我的问题!将媒体键与 EvenListener 一起使用并不是实现此目的的有效方法。并非所有浏览器都支持媒体会话 API。

使用媒体会话 API 的示例:

if ('mediaSession' in navigator) {

//setting the metadata

  navigator.mediaSession.metadata = new MediaMetadata({

    title: 'Unforgettable',

    artist: 'Nat King Cole',

    album: 'The Ultimate Collection (Remastered)',

    artwork: [

      { src: 'https://dummyimage.com/96x96',   sizes: '96x96',   type: 'image/png' },

      { src: 'https://dummyimage.com/128x128', sizes: '128x128', type: 'image/png' },

      { src: 'https://dummyimage.com/192x192', sizes: '192x192', type: 'image/png' },

      { src: 'https://dummyimage.com/256x256', sizes: '256x256', type: 'image/png' },

      { src: 'https://dummyimage.com/384x384', sizes: '384x384', type: 'image/png' },

      { src: 'https://dummyimage.com/512x512', sizes: '512x512', type: 'image/png' },

    ]

  });


  navigator.mediaSession.setActionHandler('play', function() { /* Code excerpted. */ });

  navigator.mediaSession.setActionHandler('pause', function() { /* Code excerpted. */ });

  navigator.mediaSession.setActionHandler('stop', function() { /* Code excerpted. */ });

  navigator.mediaSession.setActionHandler('seekbackward', function() { /* Code excerpted. */ });

  navigator.mediaSession.setActionHandler('seekforward', function() { /* Code excerpted. */ });

  navigator.mediaSession.setActionHandler('seekto', function() { /* Code excerpted. */ });

  navigator.mediaSession.setActionHandler('previoustrack', function() { /* Code excerpted. */ });

  navigator.mediaSession.setActionHandler('nexttrack', function() { /* Code excerpted. */ });

  navigator.mediaSession.setActionHandler('skipad', function() { /* Code excerpted. */ });

}

现在对于 Electron,如果您使用最新版本,那么您可能可以使用媒体会话 API(在渲染器进程中),并且在播放 Youtube 视频时它可以像 chrome 一样正常工作(您可以播放/暂停、转到下一个和上一个媒体) ...)。但是,当另一个应用程序在我们的 Electron 应用程序(例如 Chrome)之前开始使用媒体键时,我们仍然会遇到问题,这个问题无法使用媒体会话 API 来解决。在 Electron 中,我们有globalShortcut来自 Electron 包的用于设置快捷方式的示例:


const { app, globalShortcut } = require('electron')


app.whenReady().then(() => {

  globalShortcut.register('Alt+CommandOrControl+I', () => {

    console.log('Electron loves global shortcuts!')

  })

}).then(createWindow)

这对于所有快捷键都可以正常工作,但对于媒体键则效果不佳!原因是因为Linux密钥默认被窃取dbus,所以我们需要操作系统级别控制(直接与dbus交互的包)。我搜索了它,发现一些传入的包(未完成)使用 Linux 的 dbus 来处理媒体密钥。 


查看完整回答
反对 回复 2023-07-20
?
动漫人物

TA贡献1815条经验 获得超10个赞

应该适用于铬/电子


document.addEventListener('keyup', ({ key }) => { 

  const mediaKey = [

    'MediaTrackNext', 

    'MediaTrackPrevious', 

    'MediaPlayPause', 

    'MediaStop'].includes(key)

    

  mediaKey && console.log(key)

})


查看完整回答
反对 回复 2023-07-20
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信