b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

键盘键的修改和管理(Windows版)

电脑杂谈  发布时间:2020-10-23 00:00:53  来源:网络整理

键盘改键软件_键盘改键软件6.0_键盘改键软件

我不知道您一生中是否遇到以下任何一种情况:键盘上较重要的键之一已损坏或出现故障,您需要更换键盘或某些游戏中的某些默认键和办公软件是不合理的,或者希望自己动手制作一套自己的按键布局。那我认为这篇文章对您会很有帮助。

由于过去几个月的一时兴起,我想尝试其他一些键布局(例如Dvorak,Norman,Colemak等),并且需要修改键盘键。实际上,有很多修改键位置的方法,更常见的是安装第三方辅助软件来修改键位置的映射和功能。但是对我个人而言,出于简单,安全,自由和可控制的原因,我不喜欢在计算机上安装一些不必要的软件。可以通过修改基础注册表在Windows上实现此功能。

首先讨论本文的一般内容:

实施原理自制管理工具(Python3)

实施原则

Windows注册表中有一个“ Scancode Map”键。我们可以通过修改此键的值来修改键映射。

键盘改键软件6.0_键盘改键软件_键盘改键软件

“ 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个十六进制值(即前8组00)表示版本号和头字节,后4个十六进制值(即后4组00)0)表示结束标志,中间的xx表示映射数,最小值为01(考虑到结束标志中的4组00),方括号中的项目是可写的,也就是我们的关键部分来修改关键位置。每四个代表一组映射。

键盘上的每个键都有其十六进制扫描代码。例如,A的扫描码为“ 1e”,其十六进制扫描码校正形式(为方便起见)为“ 001e”,B的扫描码为“ 0030”,右ctrl键的扫描码为“ e01d” ”,右alt键的扫描代码表示为“ e038”,空值的扫描代码表示为“ 0000”(可以实现无效键,换句话说,就是屏蔽按钮)。其他键的特定扫描代码已发布在源代码中。

由于我们知道键盘上的每个键都有其对应的扫描代码,因此我们假定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”是“十六进制: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键的功能。

再一个,我们需要实现右Alt键才能实现右Ctrl键的功能,并屏蔽右Ctrl键,那么其“ Scancode Map”值为“ hex:00,00,00,00” ,00,00“,00,00,03,00,00,00,1d,e0,38,e0,00,00,1d,e0,00,00,00,00”。

然后的问题是,既然我知道此键位置与所谓的键盘扫描代码和Scancode值之间的对应关系,该如何实现?

键盘改键软件_键盘改键软件_键盘改键软件6.0

不用担心,让我们逐步进行,首先打开Windows注册表编辑器(在cmd或powershell命令行中键入regedit打开),然后单击“ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Keyboard Layout”,该项目下名为``ScanCode Map''的新键(右键单击以创建一个二进制值),然后右键单击以修改名称列下的``ScanCode Map'',然后可以键入和编辑十六进制值的字符串反过来,最后确认一下。修改了注册表!

图标如下,首先为此ScanCode映射创建一个键(右键单击“键盘布局”或空白,然后选择“新二进制值”

键盘改键软件

然后修改值(我的十六进制值功能是实现左Ctrl和CapsLock的交换,毕竟是Emacs缔约方)

键盘改键软件

键盘改键软件_键盘改键软件_键盘改键软件6.0

但是,修改不会在修改完成后立即生效。由于基础密钥映射是通过注册表修改的,因此需要重新启动计算机,并且重新启动资源管理器也无济于事。

那么,我该怎么做才能还原密钥?这也很简单。有两种方法。一种是从注册表中删除您创建的ScanCode Map密钥,或使用“ hex:00,00,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,00 “只是覆盖原始值。

当然,如果有很多要修改的键,那么检查每个键的映射值并修改注册表以写入十六进制值会很麻烦(我很佩服我曾经写过一些键布局像这样)。这时我们需要一个工具来管理,您可以使用第三方软件。但是,既然我们已经知道了原理,那么离工程水平并不难,因此您可以自己实现此管理工具。我们可以用Java,C ++,Python等编写。没关系,只要使用您喜欢的任何东西即可。下面是我用Python编写的布局管理工具。

自制管理工具

此工具称为layout_manage.py,其功能是将我们要修改的关键位置关系转换为十六进制,并导出bat或reg文件(bat是Windows批处理文件,reg是Windows注册表脚本文件,此处的功能是将十六进制值写入到先前注册表中的“ ScanCode Map”键中)到layout_bat或layout_reg文件夹。它不具有修改注册表的功能(python自己的权限),但是生成的文件具有此功能。

也就是说,我们要修改以下键位置:交换qwer和asdf,交换键盘上的123和789,并屏蔽右Shift键。目前,我们只需要创建一个新的文本文件(例如,名为test.txt的文件)并编写以下内容:

键盘改键软件6.0_键盘改键软件_键盘改键软件

键盘改键软件

此文件的内容由键值对组成。 “ Q:A”表示将物理键Q映射到A字符,即按Q键以键入A,这使人们更容易理解。冒号之前的物理密钥。关键功能是在冒号之后。讨论此格式规则:

忽略大小写忽略换行符,冒号和分号之前和之后的空格字符(两个单词之间的空格不会被忽略,例如Left Ctrl,只能有一个空格)。您需要在小键盘上的字符之前添加n,例如小号“ 0”和“。”。键盘上的“ n0”和“ n”。分别。一些功能键需要正确编写,例如:Tab,Esc,CapsLock,Backspace,Delete,Enter,Left Ctrl,Left Windows等。

然后我们将此文件作为参数传递给layout_manage.py并执行它。有两种方法。第一种是将txt文件直接拖动到layout_manage.py图标,以便layout_manage.py也可以顺利执行。第二种方法是在cmd或powershell中执行命令“ python layout_manage.py test.txt”,注意路径问题。

此外,如果没有其他参数传递给脚本文件(即双击直接执行),将生成一个恢复文件,即具有初始键位置的文件,这也非常方便

附加源代码,注释应该非常清楚:

import sys
import os
save_format = "bat"    #这个值可以修改,有两个选项(bat和reg),可选择生成bat批处理文件或者reg注册表脚本文件,功能一样
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:
        if save_format == "bat":
            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文件夹下,以管理员身份右键执行该文件后重启系统生效。\n按回车键退出程序...")
        else:
            with open("layout_reg/recover.reg",w) as f:
                f.write(Windows Registry Editor Version 5.00\n[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Keyboard Layout]\n"ScanCode Map"=hex:00,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00)
            input("恢复文件recover.reg已生成至layout_reg文件夹下,双击执行该文件后重启系统生效。\n按回车键退出程序...")
    elif len(sys.argv) == 2:
        scan_code_dict = {
            "00 00":"None",
            "01 00":"Esc",    #即Esc键的扫描码是"0001"
            "02 00":"1",
            "03 00":"2",
            "04 00":"3",
            "05 00":"4",
            "06 00":"5",
            "07 00":"6",
            "08 00":"7",
            "09 00":"8",
            "0a 00":"9",
            "0b 00":"0",
            "0c 00":"-",
            "0d 00":"=",
            "0e 00":"Backspace",
            "0f 00":"Tab",
            "10 00":"Q",
            "11 00":"W",
            "12 00":"E",
            "13 00":"R",
            "14 00":"T",
            "15 00":"Y",
            "16 00":"U",
            "17 00":"I",
            "18 00":"O",
            "19 00":"P",
            "1a 00":"[",
            "1b 00":"]",
            "1c 00":"Enter",
            "1d 00":"Left Ctrl",
            "1e 00":"A",
            "1f 00":"S",
            "20 00":"D",
            "21 00":"F",
            "22 00":"G",
            "23 00":"H",
            "24 00":"J",
            "25 00":"K",
            "26 00":"L",
            "27 00":"Semicolon",    #由评论区指出,键盘上的“;”应该用其他值代替,否则会与配置文本文件中的“;”混淆
            "28 00":"",
            "29 00":"`",
            "2a 00":"Left Shift",
            "2b 00":"\\",
            "2c 00":"Z",
            "2d 00":"X",
            "2e 00":"C",
            "2f 00":"V",
            "30 00":"B",
            "31 00":"N",
            "32 00":"M",
            "33 00":",",
            "34 00":".",
            "35 00":"/",
            "36 00":"Right Shift",
            "37 00":"n*",
            "38 00":"Left Alt",
            "39 00":"Space",
            "3a 00":"Caps Lock",
            "3b 00":"F1",
            "3c 00":"F2",
            "3d 00":"F3",
            "3e 00":"F4",
            "3f 00":"F5",
            "40 00":"F6",
            "41 00":"F7",
            "42 00":"F8",
            "43 00":"F9",
            "44 00":"F10",
            "45 00":"Num Lock",
            "46 00":"Scroll Lock",
            "47 00":"n7",
            "48 00":"n8",
            "49 00":"n9",
            "4a 00":"n-",
            "4b 00":"n4",
            "4c 00":"n5",
            "4d 00":"n6",
            "4e 00":"n+",
            "4f 00":"n1",
            "50 00":"n2",
            "51 00":"n3",
            "52 00":"n0",
            "53 00":"n.",
            "57 00":"F11",
            "58 00":"F12",
            
            "1c e0":"nEnter",
            "1d e0":"Right Ctrl",
            "37 e0":"PrtSc",
            "38 e0":"Right Alt",
            "47 e0":"Home",
            "48 e0":"Up",
            "49 e0":"Page Up",
            "4b e0":"Left",
            "4d e0":"Right",
            "4f e0":"End",
            "50 e0":"Down",
            "51 e0":"Page Down",
            "52 e0":"Insert",
            "53 e0":"Delete",
            "5b e0":"Left Windows",
            "5c e0":"Right Windows",
            }
        fun_key_dict = dict((m.upper(),n) for n,m in scan_code_dict.items())    #键值互换,键值全大写
        content = 00 00 00 00 00 00 00 00
        
        #用于暂时保存映射前后的键位,判断这次键位修改是否有风险
        before_map_set = set()
        after_map_set = set()
        with open(sys.argv[1]) as f:
            p = f.read().strip().split(;)
            p.remove()
            content +=  {:0>2x} 00 00 00.format(len(p)+1)
            try:
                for i in p:
                    if len(i.strip().split(:)) == 2:
                        before_map_set.add(i.split(:)[0].strip().upper())
                        after_map_set.add(i.split(:)[1].strip().upper())
                        content +=  +fun_key_dict[i.split(:)[1].strip().upper()]+ +fun_key_dict[i.split(:)[0].strip().upper()]
                    else:
                        raise CountError
                content +=  00 00 00 00
            except KeyError:
                print("文件中键名称有误")
                
            except CountError:
                print("文件中未按格式书写")
            else:
                if before_map_set != after_map_set:
                    run = input("此次键位替换存在风险,{}键功能将在键盘上无对应按键,是否继续?(输入y继续,否则退出程序)".format(str(before_map_set-after_map_set)[1:-1]))
                    if run != y:
                        sys.exit()
                if save_format == "bat":
                    with open("layout_bat/"+..join(sys.argv[1].split(\\)[-1].split(.)[:-1])+.bat,w) as g:
                        g.write(@echo off\nreg add "hklm\\system\\currentcontrolset\\control\\keyboard layout" /v "ScanCode Map" /t REG_BINARY /d "{}" /f\necho "键位已完成修改,重启系统后生效"\npause.format(.join(content.split())))
                    input("...\n{}文件已生成至layout_bat目录下,右键以管理员身份执行该文件后重启系统生效。\n按回车键退出程序...".format(..join(sys.argv[1].split(\\)[-1].split(.)[:-1])+.+save_format))
                else:
                    with open("layout_reg/"+..join(sys.argv[1].split(\\)[-1].split(.)[:-1])+.reg,w) as g:
                        g.write(Windows Registry Editor Version 5.00\n[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Keyboard Layout]\n"ScanCode Map"=hex:{}.format(,.join(content.split())))
                    input("...\n{}文件已生成至layout_reg目录下,双击执行该文件后重启系统生效。\n按回车键退出程序...".format(..join(sys.argv[1].split(\\)[-1].split(.)[:-1])+.+save_format))
    else:
        input("传入参数错误,按回车键退出程序...")

此外,可以保存此脚本生成的bat或reg文件,并且可以在其他Windows系统计算机上直接执行该bat或reg文件,并将其修改为所需的关键位置,以便可以一次生成并应用它。在多个地方!请勿将其用于恶作剧。

关于主要布局:我已经使用Dvorak超过一个月,而使用Norman则超过两个月。练习使用新密钥的第一周非常痛苦又新鲜。适应之后,我确实需要快速输入英文文章,但不太明显。如果要键入代码,则没有比较。考虑到各种因素(尤其是在使用其他人的设备时),最终返回了QWERTY关键位置。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-327921-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...