[ZZ]通过修改键盘映射替代损坏按键

时间:2024-02-23 09:22:41

我买的神舟笔记本电脑因为使用不当,致使Ctrl键与PageUp键损坏。而该电脑仅有键盘左下角一个Ctrl键,损坏之后给日常使用带来许多不便。由于 我装的是Windows 2000 + Debian Linux双系统,而登录Windows被我先前设置为需要按下Ctrl+Alt+Del才能出现登录窗口,Ctrl键的损坏使得我暂时不能进入 Windows,因此在我购买外置USB键盘之前,我都是在Linux下工作,并最终通过修改键盘映射,将不常用的按键映射到Ctrl和PageUp上, 解决了按键损坏带来的问题。而后,我也找到了Windows下修改键盘映射的方法。现将诸方法与网友共分享,以供参考。

一、Linux下的键盘映射修改方法

1、使用GNOME中的键盘首选项解决Ctrl键损坏的问题

在GNOME下可以方便地修改键盘的布局选项,这其中就有Ctrl键的位置设置。我最初就是用这个方法在GNOME下解决Ctrl键损坏的问题的。由于CapsLock键不常用,因为就用它来代替坏掉的Ctrl键。

方法:选择 系统->首选项->键盘,弹出键盘首选项设置对话框。在“布局选项”选项卡中,设置“Ctrl key position”为“Swap Ctrl and CapsLock”。这样Ctrl键就与CapsLock键交换,就可以用CapLock键来代替坏掉的Ctrl键了。当然,你也可以选择“Make CapsLock an additional Ctrl”。
2、使用loadkeys改变tty终端下的键盘映射

虽然在GNOME下解决了Ctrl键的使用问题,可是切换到终端下,Ctrl与CapsLock又恢复了原来的行为。这时我们可以通过loadkeys来改变终端下的键盘映射。

通过查询manpage可知,系统提供的键盘布局文件是放在/usr/share/keymaps目录下的。找到其中的 defkeymap.kmap.gz文件(在/usr/share/keymaps/i386/qwerty目录下),复制到用户的HOME目录中,解压 并打开它。我们要做的就是把Ctrl键映射到CapsLock键上。找到其中包含Caps_Lock的那一行:keycode 58 = Caps_Lock,那就是CapsLock键对应的扫描码了。将它改成:keycode 58 = Control即可。如果想将Ctrl与CapsLock键交换,可以找到含有Control字样的keycode定义:keycode 29 = Controlkeycode 97 = Control,它们分别对应左、右Ctrl键(当然在我机器上只有左边的扫描码为29的Ctrl)。将其改为:keycode 29 = Caps_Lock即可。

在终端下,Shift+PageUp/PageDown是常用的屏幕向上/下翻页的快捷键。而PageUp键的损坏影响了这一功能的使用。我通过将 PageUp映射到不常用的“鼠标右键菜单”键上,解决了终端下的翻页问题。方法是:运行showkey命令,这时可以通过按下键盘上的按键,程序会显示 该键按下与释放所对应的扫描码。由此法可得到鼠标右键菜单键对应的扫描码为0x7f,即127。又在另一台机器上找到PageUp对应的扫描码为104。 在defkeymap.kmap文件中找到keycode 104对应的那两行:

Copy code
keycode 104 = Prior
shift   keycode 104 = Scroll_Backward


把扫描码127的那一行改成:

Copy code
keycode 127 = Prior
shift   keycode 127 = Scroll_Backward


即可。

现在我们已经有了修改过后的defkeymap.kmap文件。要在终端中使用这个键盘映射,我们只需要执行loadkeys defkeymap.kmap即可。可是这样每次进入终端都要执行这个命令,十分不爽,而我们又不应该将其加入.bashrc中,否则运行gnome- terminal时也会执行loadkeys命令,而虚拟终端下执行loadkeys会产生错误。这时,我们可以将在/etc目录下找到的kmap文件 ——/etc/console/boottime.kmap.gz按如上的方法修改,并将修改过后的文件用gzip压缩后替换原来的文件。这样,系统启动 后就会加载这个文件,使得每个终端睛的键盘映射都得到了改变。

3、使用setxkbmap在GNOME下将PageUp映射到鼠标右键菜单键上

虽然前面讲了在GNOME将Ctrl键映射到CapsLock键上的方法,但是还没有解决将PageUp键映射到鼠标右键菜单键上的问题。桌面环境自带的键盘首选项里没有相关的选项。经过在网上的寻找及自己的研究,我终于解决了这个问题:使用setxkbmap。

百度上能找到的修改X下的键盘映射的文章几乎都是讲使用xmodmap,执行xmodmap -pke > ~/.xmodmaprc后修改.xmodmaprc文件以达到修改的目的。但我试验后发现不成功。后来在国外的网站上看到说现在的桌面环境,如 GNOME、KDE等已经不再使用xmodmap了,而采用XKB进行键盘管理。通过setxkbmap可以较为方便地达到设定的目的。

例如,执行setxkbmap -option ctrl:swapcaps就可以将Ctrl键与CapsLock键进行切换。setxkbmap -print就可以显示当前键盘的布局及选项设置。执行setxkbmap -option就可以恢复到默认选项。

通过查看manpage得知,XKB的所有组件的源文件都在/usr/lib/X11/xkb目录下。而我的机器找到的是在/usr/share/X11 /xkb目录下。通过grep -R swapcaps *找到目录下所有包含swapcaps字样的文件,由此可知,swapcaps是在symbos/ctrl文件里定义的。打开该文件,可以见到 swapcaps是如此定义的:

Copy code
partial modifier_keys 
xkb_symbols "swapcaps" {
key <CAPS>   { symbols[Group1]= [ Control_L ] };
key <LCTL>   { symbols[Group1]= [ Caps_Lock ] };
};


以管理员身份编辑该文件,将这一部分复制一份,并修改为:

Copy code
partial modifier_keys 
xkb_symbols "swapmenu" {
key <MENU>   { symbols[Group1]= [ Prior ] };
key <PGUP>   { symbols[Group1]= [ Menu ] };
};


其中MENU即是“鼠标右键菜单键”,它的定义是在symbols/pc文件里找到的。
修改保存后,仍然不能使用setxkbmap -option ctrl:swapmenu。这时我们需要将先前用grep搜索到的文件里包含swapcaps的那一段统统复制一份,并将swapcaps改为 swapmenu。需要修改的文件有:symbols.dir、rules/base、rules/base.lst与rules/base.xml。这 样,我们就可以通过setxkbmap -option ctrl:swapmenu来将PageUp键与鼠标右键菜单键交换。此后鼠标右键菜单键就可以被当作PageUp键使用了。

二、Windows下的键盘映射修改方法

后来我买了个USB键盘(我懒得花钱去修键盘),总算进了Windows。我就想,Windows下也应该有修改键盘映射的方法吧。于是,我在网上好不容易找到了修改键盘映射的软件——sharpkeys。

Sharpkeys可以从http://www.randyrants.com下载并免费使用。我使用的是它的1.1版本。它通过修改Windows 2000/XP/2003的注册表里的特殊项来达到键盘映射的目的。下面我就来给大家演示一下如何使用。

以管理员身份运行sharpkeys。点击“Add”按钮,即可弹出如图所示的对话框。左边即是原来的按键,右边则为将要映射到的按键。例如将 CapsLock键映射为Ctrl键,则在左边选择Caps Lock,右边选择Left Ctrl即可。另外,点击“Type Key”即可弹出一对话框,接收用户的按键,并自动选择对应的列表中的选项。例如要将鼠标右键菜单键映射为PageUp键,则可点击“Type Key”按钮,按下鼠标右键菜单键,并点击OK,再在右边选择Page Up即可。
完成设置之后,在主窗口中点击“Write to Registry”即可将改动写入注册表。注销后即可生效。怎么样?现在按CapsLock+Alt+Del键就可以调出登录对话框了。
(完)