我有兴趣重新映射键盘上的一些键。特别是,我想按住功能键,按 F1 键,然后触发脚本。我知道这xev
对于找出与按键关联的键码很有用。例如,当我按下该x
键时,我得到:
KeyPress event, serial 41, synthetic NO, window 0x2600001,
root 0xae, subw 0x0, time 1597243, (-190,43), root:(910,336),
state 0x0, keycode 53 (keysym 0x78, x), same_screen YES,
XLookupString gives 1 bytes: (78) "x"
XmbLookupString gives 1 bytes: (78) "x"
XFilterEvent returns: False
KeyRelease event, serial 41, synthetic NO, window 0x2600001,
root 0xae, subw 0x0, time 1597363, (-190,43), root:(910,336),
state 0x0, keycode 53 (keysym 0x78, x), same_screen YES,
XLookupString gives 1 bytes: (78) "x"
XFilterEvent returns: False
这对我来说很有意义。
但是,当我按 Function-F1 时,我不明白会发生什么。为什么按 Function-F1 看起来就像我也按住了 Windows 按钮并输入了字母l
?
xev
当我按下 Function-F1 时输出:
KeyPress event, serial 41, synthetic NO, window 0x2600001,
root 0xae, subw 0x0, time 1735349, (-157,221), root:(943,514),
state 0x0, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 41, synthetic NO, window 0x2600001,
root 0xae, subw 0x0, time 1735350, (-157,221), root:(943,514),
state 0x40, keycode 46 (keysym 0x6c, l), same_screen YES,
XLookupString gives 1 bytes: (6c) "l"
XmbLookupString gives 1 bytes: (6c) "l"
XFilterEvent returns: False
MappingNotify event, serial 41, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 248
KeyPress event, serial 41, synthetic NO, window 0x2600001,
root 0xae, subw 0x0, time 1735356, (-157,221), root:(943,514),
state 0x40, keycode 160 (keysym 0x1008ff2d, XF86ScreenSaver), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 41, synthetic NO, window 0x2600001,
root 0xae, subw 0x0, time 1735357, (-157,221), root:(943,514),
state 0x40, keycode 160 (keysym 0x1008ff2d, XF86ScreenSaver), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
MappingNotify event, serial 42, synthetic NO, window 0x0,
request MappingKeyboard, first_keycode 8, count 248
KeyRelease event, serial 42, synthetic NO, window 0x2600001,
root 0xae, subw 0x0, time 1735463, (-157,221), root:(943,514),
state 0x40, keycode 46 (keysym 0x6c, l), same_screen YES,
XLookupString gives 1 bytes: (6c) "l"
XFilterEvent returns: False
KeyRelease event, serial 43, synthetic NO, window 0x2600001,
root 0xae, subw 0x0, time 1735470, (-157,221), root:(943,514),
state 0x40, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
当我在文本窗口聚焦的情况下按 Function-F1 时,它会键入字母l
。
背景信息:在东芝 r835 上运行 Lubuntu 11.10。很高兴提供任何可能有用的进一步详细信息。
编辑:
作为比较,当我输入 Function-F12 时,我得到:
KeyPress event, serial 41, synthetic NO, window 0x2200001,
root 0xae, subw 0x0, time 8369184, (-620,473), root:(480,766),
state 0x0, keycode 78 (keysym 0xff14, Scroll_Lock), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 41, synthetic NO, window 0x2200001,
root 0xae, subw 0x0, time 8369344, (-620,473), root:(480,766),
state 0x0, keycode 78 (keysym 0xff14, Scroll_Lock), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
我想检查一下 F1-F12 键是否有什么特别之处,但看起来至少其中一些键按我的预期工作。
答案1
当您说“Function-F1”时,我假设您的意思是按Fn笔记本电脑角落里那个有趣的小键,然后再按F1键盘左上角的键。并且您正在尝试映射某些笔记本电脑键盘具有的额外键(例如“睡眠”)之一。
看起来这个键实际上是在为您按下多个键。首先,我将Win+L视为一个组合。在 Windows 上,此快捷方式会锁定屏幕,但不会启动屏幕保护程序。
接下来,我看到 XF86ScreenSaver 的映射,这可能意味着 X 正在看到某种睡眠键代码。我猜测笔记本电脑键盘上的那个键实际上是在发送Win+ L+这三个键码Sleep,以方便 Windows 用户快速锁定屏幕并激活屏幕保护程序。
我不确定有什么好方法可以过滤掉这些。这Fn Linux 内核通常看不到键盘上的按键相反,它会更改键盘告诉内核的代码。当我尝试使用 USB RF PowerPoint 遥控器时开发办公室在 Linux 上,我发现启动/停止演示的按钮只是一个发送交替F5和Esc关键代码的蹩脚控件。其他按钮也同样蹩脚,比如发送出去b使屏幕空白。
答案2
我用了xbindkeys以此目的。只需运行xbindkeys -k
并按下所需的按钮即可。
您应该得到如下输出:
"(Scheme function)"
m:0x0 + c:244
XF86Battery
将其粘贴到.xbindkeysrc
主目录中的文件中。现在您想用(Scheme Function)
您希望执行的命令替换该部分,例如perl /home/my_script.pl
运行脚本。
这将使您重新映射键的任务变得更加容易。