V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
raiz
V2EX  ›  问与答

蓝牙键盘按键 remap ?

  •  
  •   raiz · 2016-03-23 09:45:53 +08:00 · 1530 次点击
    这是一个创建于 3177 天前的主题,其中的信息可能已经有所发展或是发生改变。

    从狗东买了一个低端蓝牙键盘, 按键布局是 mac 风格的, 第一行的按键全部需要组合 Fn 键才能使用, esc 键要组合这个接受不了, 没有 home/end/pageU/pageD 这些键,找了一些 remap 软件,只能把常用的键互换位置,均检测不到 fn 键,好像 fn 键组合键的键码是硬件上产生的,驱动只能检测到组合过的码。

    有软件上的解决方法吗?

    如果没有,只能硬件上来搞个反相器在 fn 上了 -,-!!

    7 条回复    2016-03-24 12:28:57 +08:00
    BOYPT
        1
    BOYPT  
       2016-03-23 09:49:05 +08:00
    黑进去键盘的固件里面改
    raiz
        2
    raiz  
    OP
       2016-03-23 10:33:37 +08:00
    @BOYPT 低端到连驱动都是通用的
    redsonic
        3
    redsonic  
       2016-03-23 11:44:42 +08:00
    fn 会产生 scancode ,只是内核不会把它送给终端及终端上的应用程序,所以那些软件都看不到。如果 LZ 用的是 linux ,可以把 linux 上面 mac 键盘的驱动移植一部分到你那个通用键盘驱动里面, mac 的键盘驱动是可以通过 /sys/module/hid_apple/parameters/fnmode 这个 entry 修改 fn 键的默认状态。

    drivers/hid/hid-apple.c

    static int hidinput_apple_event(struct hid_device *hid, struct input_dev *input,
    struct hid_usage *usage, __s32 value)
    {
    struct apple_sc *asc = hid_get_drvdata(hid);
    const struct apple_key_translation *trans, *table;

    if (usage->code == KEY_FN) {
    asc->fn_on = !!value;
    input_event(input, usage->type, usage->code, value);
    return 1;
    }

    if (fnmode) {
    int do_translate;

    if (hid->product >= USB_DEVICE_ID_APPLE_WELLSPRING4_ANSI &&
    hid->product <= USB_DEVICE_ID_APPLE_WELLSPRING4A_JIS)
    table = macbookair_fn_keys;
    else if (hid->product < 0x21d || hid->product >= 0x300)
    table = powerbook_fn_keys;
    else
    table = apple_fn_keys;

    trans = apple_find_translation (table, usage->code);

    if (trans) {
    if (test_bit(usage->code, asc->pressed_fn))
    do_translate = 1;
    else if (trans->flags & APPLE_FLAG_FKEY)
    do_translate = (fnmode == 2 && asc->fn_on) ||
    (fnmode == 1 && !asc->fn_on);
    else
    do_translate = asc->fn_on;

    if (do_translate) {
    if (value)
    set_bit(usage->code, asc->pressed_fn);
    else
    clear_bit(usage->code, asc->pressed_fn);

    input_event(input, usage->type, trans->to,
    value);

    return 1;
    }
    }
    BOYPT
        4
    BOYPT  
       2016-03-23 13:10:36 +08:00
    @raiz 蓝牙键盘必须通用的吧
    raiz
        5
    raiz  
    OP
       2016-03-24 10:45:38 +08:00
    @BOYPT 我看到有些雷蛇的鼠标有自己的客户端可以个性化设置。 蓝牙键盘没有这类玩意吗?
    @redsonic 我是 用 windows 哈哈
    BOYPT
        6
    BOYPT  
       2016-03-24 10:48:09 +08:00
    @raiz 嗯我的机械键盘也有个小工具可以定义组合键什么的,是 USB 键盘;蓝牙键盘可能不支持自定义的通信吧,因为有专门的 HID 协议
    redsonic
        7
    redsonic  
       2016-03-24 12:28:57 +08:00
    @BOYPT
    @raiz
    雷蛇那个应该不是通用驱动的,否则不会接收客户端程序的私有指令。 其实蓝牙键盘的堆栈是下层蓝牙协议栈,上层 HID ,只要厂商在 HID 层开发指令和驱动就能实现,和无线不无线没关系。其实最好的方案就是 hhkb 和 minila 之类的,直接弄个硬件开关,这样通用驱动也能切换。提主纠结这个不如直接买个大厂的,用着顺手 夸张一点终生都不会换。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3680 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 04:34 · PVG 12:34 · LAX 20:34 · JFK 23:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.