有沒有辦法禁用筆記型電腦鍵盤上的飛行模式按鈕?
前段時間我給媽媽買了一台筆記型電腦,鍵盤佈局很*糟糕。*作業系統是 Linux Mint 18.2 Cinnamon 64 位。
F1
問題是,她沒有-鍵,而是F12
有不同的多媒體按鈕,更重要的是飛行模式按鈕。-鍵可以通過訪問F1
。F12``Fn
因為我們有很多寵物,它們經常跳到鍵盤上,按下包括飛行模式按鈕在內的多個按鈕,從而使她與網際網路斷開連接,這是她最近抱怨的。
在 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:
一旦按下 Airplane 按鈕,無線就會根據之前的命令被封鎖Soft。
編輯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 ------------
我沒有確切的硬體,但我試圖在我的系統中找到一個“類似案例”:
- 一個是電源按鈕。目標是輸入一個鍵(例如鍵“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 - ————
- 另一個是(這也是我對soo很感興趣的原因):我也有一個WIFI按鈕,但是“什麼都不做”。雖然我了解輸入事件,但我想糾正這個 - 好玩。這裡的目標是做某事。
此 Fn+F3 發出(從普通鍵盤輸入設備)
root# evtest /dev/input/event3
Event: time 1509218870.384483, type 4 (EV_MSC), code 4 (MSC_SCAN), value 86
Event: time 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
syslogsetkeycodes 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 腳本並玩了一下。我的概念是“攔截 power putton 事件,不要通過並註入另一個事件(例如 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 次,我得到 ‘4444’ - 在控制台和 X 中。