我前段时间给妈妈买了一台笔记本电脑不幸的键盘布局。操作系统是 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 5
。setkeycodes 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.py
python 脚本并玩了一下。
我的概念是“拦截电源推杆事件,不要通过并注入另一个事件(例如 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”。