我正在编写一个简单的Chrome扩展,它可以拦截媒体密钥事件并与网站交互。
我已经设置好了,可以通过点击它来切换扩展。打开时,它会监视一个选项卡,并在按下媒体键时向其发送事件。当它关闭时,它仍然会拦截媒体按键,但不会对它们做任何事情。
我的问题是,当扩展为"0"时,我想停止拦截媒体按键;关闭";。我希望Chrome能像正常情况下那样使用媒体密钥,如果我的扩展没有安装的话。我想有一种方法可以停止拦截按键,或者将它们转发到Chrome,但我不知道怎么做。
目前我正在使用清单拦截按键,代码为:
{
.... a bunch of stuff ...
"manifest_version": 3,
"background": {
"service_worker": "background.js"
},
"commands": {
"playPause": {
"suggested_key": {
"default": "MediaPlayPause"
},
"global": true,
"description": "Toggle play/pause"
},
"playNext": {
"suggested_key": {
"default": "MediaNextTrack"
},
"global": true,
"description": "Play next track"
},
"playPrev": {
"suggested_key": {
"default": "MediaPrevTrack"
},
"global": true,
"description": "Play previous track"
}
}
}
然后我用这个抓住了按键:
function commandFired(command) {
chrome.storage.local.get('activeTabId', result => {
if (result.activeTabId == -1) {
//send to chrome normally here
return;
}
switch (command) {
case "playNext":
//Handling next
break;
case "playPrev":
//Handling prev
break;
case "playPause":
//Handling play
break;
}
});
}
chrome.commands.onCommand.addListener(commandFired);
Chrome没有API以编程方式禁用热键,因此您必须注销整个服务工作者,并在弹出窗口中提供一个按钮来重新注册。
manifest.json:
"action": {"default_popup": "popup.html"},
popup.html:
<label><input type=checkbox id=power>Enabled</label>
<script src=popup.js></script>
popup.js:
Object.assign(document.getElementById('power'), {
checked: !!navigator.serviceWorker.controller,
async onchange() {
if (this.checked) {
const bg = chrome.runtime.getManifest().background;
await navigator.serviceWorker.register(bg.service_worker, {type: bg.type});
} else {
(await navigator.serviceWorker.getRegistration())?.unregister();
}
},
});
如果您想继续侦听其他chrome
事件,请在注销主文件后注册另一个bg2.js文件。主bg.js可以导入bg2.js来消除代码的重复,更多信息。