有没有办法禁用笔记本电脑键盘上的飞行模式按钮?

有没有办法禁用笔记本电脑键盘上的飞行模式按钮?

我前段时间给妈妈买了一台笔记本电脑不幸的键盘布局。操作系统是 Linux Mint 18.2 Cinnamon 64 位。

问题是,她没有F1-F12键,而是有不同的多媒体按钮,更重要的是一个飞行模式按钮。可以通过 访问F1-键。F12Fn

因为我们有很多宠物,所以它们经常跳到键盘上按下多个按钮,包括飞行模式按钮,从而使她与互联网断开连接,她最近抱怨这一点。

在 BIOS 中我没有看到切换到正常键盘布局的方法。所以,你的问题是:

有没有办法禁用笔记本电脑键盘上的飞行模式按钮?

编辑1:

将宠物拒之门外是不可能的,因为它们是我们家庭不可或缺的一部分。

当然,当妈妈不在电脑前时,她会合上盖子。但当她在笔记本电脑前时,他们就会跳上笔记本电脑。从这个意义上说,猫可能是真正的痛苦:)

编辑2:

当飞行模式关闭时,即无线打开时,以下命令:

rfkill list all

输出:

0: ideapad_wlan: Wireless LAN
    Soft blocked: no
    Hard blocked: no
1: ideapad_bluetooth: Bluetooth
    Soft blocked: yes
    Hard blocked: no
2: hci0: Bluetooth
    Soft blocked: yes
    Hard blocked: no
3: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no

编辑3:

一旦按下飞行按钮,根据先前命令的无线就会被阻止柔软的

编辑4:

acpi_listen

当按下按钮时,输出:

button/wlan WLAN 00000080 00000000 K 

编辑5:

sudo evtest

输出:

No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:    Lid Switch
/dev/input/event1:    Power Button
/dev/input/event2:    Power Button
/dev/input/event3:    AT Translated Set 2 keyboard
/dev/input/event4:    MOSART Semi. 2.4G Wireless Mouse
/dev/input/event5:    Video Bus
/dev/input/event6:    Video Bus
/dev/input/event7:    ETPS/2 Elantech Touchpad
/dev/input/event8:    Ideapad extra buttons
/dev/input/event9:    Lenovo EasyCamera
/dev/input/event10:    HDA Intel PCH Mic
/dev/input/event11:    HDA Intel PCH Headphone
/dev/input/event12:    HDA Intel HDMI HDMI/DP,pcm=3
/dev/input/event13:    HDA Intel HDMI HDMI/DP,pcm=7
/dev/input/event14:    HDA Intel HDMI HDMI/DP,pcm=8 
Select the device event number [0-14]: 8
Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x0 product 0x0 version 0x0
Input device name: "Ideapad extra buttons"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 1 (KEY_ESC)
    Event code 148 (KEY_PROG1)
    Event code 149 (KEY_PROG2)
    Event code 186 (KEY_F16)
    Event code 192 (KEY_F22)
    Event code 193 (KEY_F23)
    Event code 202 (KEY_PROG3)
    Event code 203 (KEY_PROG4)
    Event code 212 (KEY_CAMERA)
    Event code 227 (KEY_SWITCHVIDEOMODE)
    Event code 238 (KEY_WLAN)
    Event code 240 (KEY_UNKNOWN)
    Event code 248 (KEY_MICMUTE)
  Event type 4 (EV_MSC)
    Event code 4 (MSC_SCAN)
Properties:
Testing ... (interrupt to exit)
Event: time 1508927031.158643, type 4 (EV_MSC), code 4 (MSC_SCAN), value 0d
Event: time 1508927031.158643, type 1 (EV_KEY), code 238 (KEY_WLAN), value 1
Event: time 1508927031.158643, -------------- SYN_REPORT ------------
Event: time 1508927031.158680, type 1 (EV_KEY), code 238 (KEY_WLAN), value 0
Event: time 1508927031.158680, -------------- SYN_REPORT ------------

答案1

我没有确切的硬件软件,但我试图在我的系统中找到一个“类似的情况”:

  • 其中之一是电源按钮。目标是输入按键(例如按键“4”)而不是电源。 (对我来说它位于 /dev/input/event2 并发出

    root# evtest /dev/input/event2
    事件:时间 1509218410.222521,类型 1 (EV_KEY),代码 116 (KEY_POWER),值 1
    事件:时间 1509218410.222521, -------------- SYN_REPORT -- ----------
    事件:时间 1509218410.222552,类型 1 (EV_KEY),代码 116 (KEY_POWER),值 0
    事件:时间 1509218410.222552, -------------- SYN_REPORT - ------------

  • 另一个是(这就是我如此感兴趣的原因):我也有一个WIFI按钮,但“不做任何事情”。虽然我理解输入事件,但我想纠正这个问题 - 为了好玩。这里的目标是做某事。
    此 Fn+F3 发出(从普通键盘输入设备)

    root# evtest /dev/input/event3
    事件:时间 1509218870.384483,类型 4 (EV_MSC),代码 4 (MSC_SCAN),值 86
    事件:时间 1509218870.384483, -------------- SYN_REPORT -- ----------

这个 Fn+F3 最初在 syslog 中给出了一条警告行

内核:[44802.485207] atkbd serio0:发布了未知密钥(翻译集 2,isa0060/serio0 上的代码 0x86)。
内核:[44802.485210] atkbd serio0:使用“setkeycodes e006”使其可知。

到目前为止我做了什么:

  • 运行许多系列的 setkeycodes
    无论evdev是“现实生活”还是“现实生活”都没有看到任何变化,但是系统日志条目消失了setkeycodes e006 5setkeycodes 86 5
  • 在 /etc/udev/hwdb 中创建了类似的 hwdb 文件 - 这也消除了系统日志消息 - 但没有其他任何事情:

    evdev:atkbd:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
    KEYBOARD_KEY_86=5

  • 在 /etc/udev/rules.d 中创建了 udev 规则(并使其生效),
    它运行(因为我看到“电源按钮 INHIBIT 字符串”并看到所有修改的标签),我可以更改任何属性(主要用于电源按钮)
    这是我的规则文件:

    ACTION!="add|change", GOTO="pwr_kbd_end"
    SUBSYSTEM!="input", GOTO="pwr_kbd_end"
    KERNEL!="event[0-9]*", GOTO="pwr_kbd_end"
    ENV{ID_PATH_TAG}== "acpi-LNXPWRBN_00", OPTIONS+="last_rule", RUN+="/usr/bin/logger -t 电源按钮 INHIBIT %k", ENV{KEYBOARD_KEY_116}="KEY_A",\ TAG:="whatisthis", ENV{EV_KEY_116 }="KEY_B", \ ENV{BTN_116}="KEY_C",ENV{BTN_POWER}="KEY_D", ENV{KEY_POWER}="KEY_E" LABEL="pwr_kbd_end"

    然而,我读到并意识到规则是针对“系统更改”的,例如连接或断开某些东西、修改(例如创建新分区或使用 modechange 3G 适配器),但它们与实际的关键事件处理无关(但是它们可能有影响)。同时OPTIONS+="last_rule"似乎不起作用 - 我输入此文件作为 01-myrule.rule 并作为硬链接 98-myrule.rule - 两者都“工作”。

  • 然后我把兴趣集中在处理事件上:
    我复制了一个evtest.pypython 脚本并玩了一下。
    我的概念是“拦截电源推杆事件,不要通过并注入另一个事件(例如 KEY_4 - 值 5 - 正如我在之前的测试中尝试过的那样)。

    这几乎是完全成功的。 (这也可能是您的解决方案)

    from __future__ import print_function
    
    import sys
    import select
    
    from evdev import ecodes, list_devices, AbsInfo, InputDevice, UInput
    
    def main():
      device = InputDevice("/dev/input/event2") # yours should be checked... NOT necessalirly always event8 
      device.grab()
      ui = UInput()
    
      print('Listening for events (press ctrl-c to exit) ...')
      fd_to_device = {device.fd: device}
    
      while True:
        r, w, e = select.select(fd_to_device, [], [])
    
        for fd in r:
          for event in fd_to_device[fd].read():
            if (event.type == 1) and (event.code==116): # yours is 238
              print_event(event)
              event.code=5
              event.value=1
              ui.write(event.type, event.code, event.value) # just delete/comment this section if you do not wanna do anything
              ui.syn
              event.value=0
              ui.write(event.type, event.code, event.value)
              ui.syn
            else:
              ui.write(event.type, event.code, event.value)
              ui.syn
    
    
    def print_event(e):
      if e.type == ecodes.EV_SYN:
        if e.code == ecodes.SYN_MT_REPORT:
          msg = 'time {:<16} +++++++++ {} ++++++++'
        else:
          msg = 'time {:<16} --------- {} --------'
        print(msg.format(e.timestamp(), ecodes.SYN[e.code]))
      else:
        if e.type in ecodes.bytype:
          codename = ecodes.bytype[e.type][e.code]
        else:
          codename = '?'
    
      evfmt = 'time {:<16} type {} ({}), code {:<4} ({}), value {}'
      print(evfmt.format(e.timestamp(), e.type, ecodes.EV[e.type], e.code, codename, e.value))
    
    
    if __name__ == '__main__':
      try:
        ret = main()
      except KeyboardInterrupt:
        ret = 0
      sys.exit(ret)
    

再说一遍,无论我是在控制台还是 X - 当这个脚本运行时,我都会得到一个键(目前它是双键)而不是“电源开关”。

  • 我拦截了(但让它们通过键盘事件),当我找到神奇的 86 代码时,我注入了一个 EV_KEY 序列(EV_KEY KEY_4 down,SYN,EV_KEY KEY_4 up,SYN),
    但这只是部分成功,因为事件不知何故卡住了并且互相等待,它们显示为一堆 4 个(我使用了 python -u wifi.py) - 所以我尝试不缓冲。这里没有重复:我按 Wifi 按钮 4 次,我在控制台和 X 中得到“4444”。

相关内容