Google chrome extension 如何查找我的Chrome扩展是否被快捷方式调用?

Google chrome extension 如何查找我的Chrome扩展是否被快捷方式调用?,google-chrome-extension,Google Chrome Extension,我有一个带有弹出窗口的Chrome扩展,也可以通过快捷方式打开。当弹出窗口打开时,我是否可以确定用户是否使用了快捷方式或是否单击了扩展图标 原因是我想提示用户使用快捷方式,但我不想向已经知道并使用快捷方式的用户显示该提示 弹出窗口和快捷方式在manifest.json中定义如下: "browser_action": { "default_icon": "images/icon48.png", "default_popup": "popup.html", "defaul

我有一个带有弹出窗口的Chrome扩展,也可以通过快捷方式打开。当弹出窗口打开时,我是否可以确定用户是否使用了快捷方式或是否单击了扩展图标

原因是我想提示用户使用快捷方式,但我不想向已经知道并使用快捷方式的用户显示该提示

弹出窗口和快捷方式在
manifest.json
中定义如下:

  "browser_action": {
    "default_icon": "images/icon48.png",
    "default_popup": "popup.html",
    "default_title": "__MSG_tooltip__"
  },
  "commands": {
    "_execute_browser_action": {
      "suggested_key": {
        "default": "Ctrl+Shift+Space"
      }
    }
  },
不可用,因为:

单击浏览器操作图标时激发。此事件不会触发 如果浏览器操作有弹出窗口

我们有
弹出窗口

chrome.commands.onCommand.addListener
不可用,因为:

“\u execute\u browser\u action”和“\u execute\u page\u action”命令是 保留用于打开扩展弹出窗口的操作。他们不会的 通常生成您可以处理的事件

可以尝试将press listener插入到某个页面,并跟踪(在每个页面上)按键的数量


从瞬间的
弹出窗口
展开将消息发送到
内容\u脚本

chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {

    chrome.tabs.sendMessage(tabs[0].id, {action: "isPressed"}, function (responce) {

        if (responce) {

        }
    });
});
消息接收后,内容脚本中的侦听器将变量
isPressed
作为响应发送:

chrome.runtime.onMessage.addListener(function (message, sender, response) {

    if (message.action == "isPressed") {

        response(isPressed);
    }
});
若变量为true,则表示通过击键调用,否则单击图标

不可用,因为:

单击浏览器操作图标时激发。此事件不会触发 如果浏览器操作有弹出窗口

我们有
弹出窗口

chrome.commands.onCommand.addListener
不可用,因为:

“\u execute\u browser\u action”和“\u execute\u page\u action”命令是 保留用于打开扩展弹出窗口的操作。他们不会的 通常生成您可以处理的事件

可以尝试将press listener插入到某个页面,并跟踪(在每个页面上)按键的数量


从瞬间的
弹出窗口
展开将消息发送到
内容\u脚本

chrome.tabs.query({active: true, currentWindow: true}, function (tabs) {

    chrome.tabs.sendMessage(tabs[0].id, {action: "isPressed"}, function (responce) {

        if (responce) {

        }
    });
});
消息接收后,内容脚本中的侦听器将变量
isPressed
作为响应发送:

chrome.runtime.onMessage.addListener(function (message, sender, response) {

    if (message.action == "isPressed") {

        response(isPressed);
    }
});
若变量为true,则表示通过击键调用,否则单击图标

我可以知道用户是否使用了快捷方式,或者他们是否使用了快捷方式吗 是否已单击扩展图标

似乎没有干净直接的方法来检测这一点

由于我努力寻找解决方法,我想与大家分享我所考虑/尝试的内容以及它不起作用的原因:

  • 将键盘快捷键附加到某些自定义命令,修改弹出页面,然后以编程方式打开它

    • 不起作用,因为没有办法以编程方式打开弹出窗口,至少在当前稳定的Chrome版本(v50)中没有
  • 使用与“\u execute\u browser\u action”相同的快捷方式创建自定义命令,并使用它向弹出窗口发送消息

    • 无法工作,因为两个命令不能共享同一快捷方式
  • 加载后立即尝试在弹出页面中捕获
    keyup

    • 我对此进行了测试,一开始它似乎是有效的,但它绝对不可靠。如果用户只短按键盘快捷键,则在弹出页面有机会为其注册侦听器之前,会触发
      keyup
      事件
  • 使用内容脚本在页面上捕获
    keydown
    ,然后向弹出页面发送消息,让其知道已按下键盘快捷键(如上面用户名所示)

    • 这应该适用于大多数页面,但内容脚本将无法在地址栏和某些页面上捕获按键(
      chrome://
      chrome extension://
    • 很难实现,因为您需要考虑用户可以在
      chrome://extensions
      第页。以编程方式查找当前分配的快捷方式以在内容脚本中对其进行测试非常困难,因为
      chrome.commands.getAll()
      提供了本地化的键名(例如
      “Ctrl+Shift+Space”
      为英语,而
      “Ctrl+Shift+Mezera”为捷克语)有些语言甚至连Ctrl和Shift都不使用英语
  • 我可以知道用户是否使用了快捷方式,或者他们是否使用了快捷方式吗 是否已单击扩展图标

    似乎没有干净直接的方法来检测这一点

    由于我努力寻找解决方法,我想与大家分享我所考虑/尝试的内容以及它不起作用的原因:

  • 将键盘快捷键附加到某些自定义命令,修改弹出页面,然后以编程方式打开它

    • 不起作用,因为没有办法以编程方式打开弹出窗口,至少在当前稳定的Chrome版本(v50)中没有
  • 使用与“\u execute\u browser\u action”相同的快捷方式创建自定义命令,并使用它向弹出窗口发送消息

    • 无法工作,因为两个命令不能共享同一快捷方式
  • 加载后立即尝试在弹出页面中捕获
    keyup

    • 我对此进行了测试,一开始它似乎是有效的,但它绝对不可靠。如果用户只短按键盘快捷键,则在弹出页面有机会为其注册侦听器之前,会触发
      keyup
      事件
  • 使用内容脚本在页面上捕获
    keydown
    ,然后向弹出页面发送消息,让其知道已按下键盘快捷键(如上面用户名所示)

    • 这应该适用于大多数页面,但内容脚本将无法在地址栏和某些页面上捕获按键(
      chrome://
      chrome extension://
    • 很难实现,因为您需要考虑用户可以在
      chrome://extensions
      第页。查找当前的assi