如何找到我的Chrome扩展程序是否被快捷方式调用?

时间:2016-05-21 11:06:52

标签: google-chrome-extension

我有一个带有弹出窗口的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"
      }
    }
  },

2 个答案:

答案 0 :(得分:2)

chrome.browserAction.onClicked.addListener

不可用,因为:

  

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

我们有popup

chrome.commands.onCommand.addListener

不可用,因为:

  

' _execute_browser_action'和' _execute_page_action'命令是   保留用于打开扩展程序弹出窗口的操作。他们没赢   通常会生成您可以处理的事件。

可以尝试将新闻监听器注入某个页面并跟踪按键(在每个页面上)。

var isPressed;

document.body.addEventListener("keydown", function (e) {

    if (!(e.keyCode != 17) || !(e.keyCode != 16) || !(e.keyCode != 32)) return;

    isPressed = true;

}); 

popup开始,将发送​​消息展开到content_scripts

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,则表示通过击键调用,否则单击图标。

答案 1 :(得分:1)

  

我可以找出用户是否使用了快捷方式或是否使用了快捷方式   点击了扩展图标?

似乎没有直接的方法来检测它。

由于我花了一些力气试图找到一种解决方法,我想分享一下我考虑/试过的内容以及它为什么不起作用的原因:

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

    • 无法正常工作,因为无法以编程方式打开弹出窗口,至少在当前稳定版Chrome(v50)中无法打开。
  2. 使用与" _execute_browser_action"相同的快捷方式创建自定义命令。并使用它向弹出窗口发送消息。

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

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

    • 这应该适用于大多数网页,但内容脚本无法捕获地址栏和某些网页上的按键(chrome://chrome-extension://)。
    • 难以实施,因为您需要考虑用户可以自定义chrome://extensions页面上的快捷方式这一事实。以编程方式查找当前分配的快捷方式以在内容脚本中对其进行测试非常困难,因为chrome.commands.getAll()提供了本地化的密钥名称(例如,英语为"Ctrl+Shift+Space",但捷克语为"Ctrl+Shift+Mezera"。甚至Ctrl和Shift都不会保留英语的语言。