使用Python修改windows键位

本文参考了《键盘键位修改及管理(Windows篇)》一文。但原文中代码有几处错误,因此有所修改。

在Windows注册表中有个”Scancode Map”(即扫描码映射)的键,我们可以通过修改这个键的值来实现键位映射的更改。

“Scancode Map”的值的格式是”hex:00,00,00,00,00,00,00,00,xx,00,00,00,[yy,yy,yy,yy,…,yy,yy,yy,yy,]00,00,00,00”

前8个16进制的值(即前8组00)表示版本号和头部字节,后4个16进制的值(即最后的4组00)表示结束标志,中间xx表示映射数目,最小值为01(考虑到结束标志的4组00),中括号内为可写项,也是我们修改键位比较关键的部分,每四个代表一组映射。

在我们键盘上每一个按键都有其十六进制扫描码,例如A的扫描码为”1e”,其十六进制扫描码修正形式(为了表示方便就这么说吧)就是”001e”,B的扫描码为”0030”。具体其他按键扫描码在源码中贴有。

既然我们知道键盘上每一个键都具有其对应的扫描码,那么我们假设需要A和B键互换,应该怎么做呢?这个时候就需要我们向中括号中添加我们需要的值,”30,00,1e,00,”就可以实现将B键的功能映射到物理键盘A上(通俗点说就是敲击键盘上的A键会打出B字符,同时要注意值的顺序)。你以为这样就完了吗?不然。”30,00,1e,00,”只能将B键功能映射在物理键盘A键位上,而物理键位B键并未被映射成A!这很危险,相当于键盘上没有一个按键能实现A的功能,所以我们还得添加一项”1e,00,30,00,”。最后我们的”Scancode Map”的完整值就为”hex:00,00,00,00,00,00,00,00,03,00,00,00,30,00,1e,00,1e,00,30,00,00,00,00,00”。就这一串值就可完全调换A,B键的功能。

每次手动修改注册表太麻烦,因此考虑写一个python的脚本key_map.py。但是python无法直接修改注册表,我们的python代码负责根据一个配置文件生成一个.bat的文件。之后以管理员身份运行.bat文件即可。为了方便恢复,还顺便生成了一个用于复原的.bat文件。

配置文件的格式如下。

Caps Lock: Left Ctrl;
Left Ctrl: Caps Lock;

配置文件可以任意命名,假设命名为key.txt,该配置文件首行含义为将物理键Caps Lock映射为Left Ctrl,第二行相反。之后只要在命令行中执行python key_map.py key.txt,就可以生成相应.bat文件。然后以管理员身份运行.bat文件后重启即可生效。

import sys
import os

save_format = "bat"

class CountError(Exception):    #文本文件格式错误异常
    pass

class FileFormatError(Exception):    #save_format值异常
    pass


if save_format not in ["bat","reg"]:
    raise FileFormatError("The variable 'save_format'`s value must be 'bat' or 'reg'.")


if __name__ == "__main__":

    if not os.path.isdir("layout_"+save_format):
        os.mkdir("layout_"+save_format)

    if len(sys.argv) == 1:
            with open("layout_bat/recover.bat",'w') as f:
                f.write('@echo off\nreg delete "hklm\\system\\currentcontrolset\\control\\keyboard layout" /v "ScanCode Map" /f\necho "键位已恢复,重启系统后生效"\npause')
            input("恢复文件recover.bat已生成至layout_bat文件夹下,
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值