在Chrome扩展程序中捕获Mac媒体控制键

时间:2012-10-01 11:34:45

标签: javascript macos google-chrome-extension

两部分问题:

  1. 有没有办法使用严格的JavaScript在Google Chrome扩展程序中捕获(对按下)Mac键盘上的媒体播放控制键(上一个,播放/暂停,下一个)?
  2. if (answerToQuestion1 === "no")有没有办法使用某种native plugin (C / C ++)?
  3. 我知道这应该是可能的,正如Unity Music Media Keys所做的那样(虽然我知道他们使用的是原生插件)。

    到目前为止,我所看到的是this plugin,声称这样做,但实际上需要FunctionFlip才能使键充当功能键,并对按下做出反应F7 F8 F8

2 个答案:

答案 0 :(得分:8)

1 - nope = [

2 - 哇 - 圣洁的废话。我以前没见过这个扩展,所以谢谢你。我挖了一下,似乎他们在osx上安装了一个.plugin,并为windows支持安装了一个dll。

反编译的插件只有几百行 - https://gist.github.com/3849247

他们使用https://github.com/nevyn/SPMediaKeyTap作为直接插入媒体密钥的方法(在os x上)。他们通过在端口12345上运行的本地socket.io服务器将其传递给浏览器,并且插件正在侦听在其上触发的事件。

supppper整洁。

编辑: 现在是natively supported in chrome

答案 1 :(得分:4)

最终我设法完成了我的目标。最终的Chrome扩展程序可以在GitHub上看到。

它是如何运作的?

我最初链接的扩展要求功能键“翻转”实际上是功能键而没有特殊用途,但这样做需要额外的按键才能执行特殊功能(例如控制键盘背光,音量等。)

Patrick's answer的大力帮助下,我使用nevyn/SPMediaKeyTap中的部分来捕获扩展程序外部的按键,并libwebsockets将它们发送到扩展程序:

- (void) handleKeyCode: (int) kcode withKeyState: (int) kstate
{
    if (kstate) {
        return; // keydown
    }
    // keyup
    int len = 1;
    unsigned char data[LWS_SEND_BUFFER_PRE_PADDING + len + LWS_SEND_BUFFER_POST_PADDING];
    data[LWS_SEND_BUFFER_PRE_PADDING] = kcode;
    for (int i = 0; i < num_clients; i++) {
        libwebsocket_write(clients[i], &data[LWS_SEND_BUFFER_PRE_PADDING], len, LWS_WRITE_TEXT);
        NSLog(@"Sent %d", kcode);
    }
}

在Chrome内部,扩展程序只是将适当的JS注入主页:

this.onmessage = function (message) {
    var keyCode = message.data.charCodeAt(0);
    if (keyCode === 20) {
        inject(function () {
            window.R.player.previous();
        });
    }
    if (keyCode === 16) {
        inject(function () {
            window.R.player.playPause();
        });
    }
    if (keyCode === 19) {
        inject(function () {
            window.R.player.next();
        });
    }
};