代码之家  ›  专栏  ›  技术社区  ›  Whymarrh

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

  •  7
  • Whymarrh  · 技术社区  · 12 年前

    由两部分组成的问题:

    1. 有没有一种方法可以在严格使用JavaScript的Google Chrome扩展中捕获(对按下做出反应)Mac键盘上的媒体播放控制键(上一个、播放/暂停、下一个)?
    2. if (answerToQuestion1 === "no") 有没有办法用某种方法 native plugin (C/C++)?

    我知道这应该是可能的,因为 Unity Music Media Keys 做到了(尽管我知道他们使用的是原生插件)。

    到目前为止,我看到的是 this plugin ,声称要这样做,但实际上需要 FunctionFlip 使按键充当功能键,并对按下 功能7 , 功能8 功能8

    2 回复  |  直到 12 年前
        1
  •  8
  •   Patrick    10 年前

    1-没有=[

    2-哇,天哪。我以前没有见过这个延期,所以谢谢你。我深入研究了一下,似乎他们在osx上安装了一个.plugin和一个用于windows支持的dll。

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

    他们正在使用 https://github.com/nevyn/SPMediaKeyTap 作为一种直接插入媒体密钥的方式(在osx上)。他们通过运行在端口12345上的本地socket.io服务器将其转发到浏览器,插件正在侦听其上触发的事件。

    支撑整齐。

    编辑: 这是现在 natively supported in chrome

        2
  •  4
  •   Community kfsone    7 年前

    最终,我成功地完成了我的目标 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();
            });
        }
    };