使用Python修改windows键位

使用Python+winreg修改/重命名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文件夹下,以管理员身份右键执行该文件后重启系统生效。\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":";",
            "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()

            content = content.replace(' ','')
            print(content)
            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(content))
                input("...\n{}文件已生成至layout_bat目录下,右键以管理员身份执行该文件后重启系统生效。\n按回车键退出程序...".format('.'.join(sys.argv[1].split('\\')[-1].split('.')[:-1])+'.'+save_format))

    else:
        input("传入参数错误,按回车键退出程序...")
Vim使用全指南 (环境配置,插件推荐,美化) (C++,Python,MarkDown,R...) 提示1:本文主要讲解了Windows下VIM的使用,配置,美化与使用VIM写C++,Python,MarkDown,R。其他语言的插件很不清楚 提示2:VIM是一款工具,使用VIM是为了加快您的Coding效率的,不要配置比使用的时间还长(虽然很好玩) 提示3:我想把这篇文章写的尽量的长,目的是帮助更多同学绕过VIM配置中的诸多天坑,请耐心观看,毕竟这要比你用一个星期去配置VIM来的快很多 0.为什么要写这篇文章 由于依赖win下的很多软件,不方便直接切换到Linux,但是关于Win下的vim使用说明与参 阅读详情

相关推荐

使用Python编程中的按键映射和替换

在Python编程中,我们经常需要处理用户输入的快捷键。快捷键是一种方便的方式,可以通过按下一组键盘上的特定按键来执行特定的操作。有时候,我们可能需要修改或替换这些快捷键,以适应我们的需求。通过定义按键映射规则和使用回调函数处理键盘事件,我们可以根据用户的需求执行相应的操作。键是快捷键的组合,值是与之关联的操作代码。您可以定义任意组合的快捷键,并将它们与您想要执行的操作相关联。在本文中,我将向您介绍一种在Python中实现按键映射和替换的方法。库来监听键盘事件,并根据用户定义的映射规则执行相应的操作。

CyberLynxX的博客 809

【笔记】键盘

就像食堂打饭:生食材先到后厨(read_q),厨师处理完(cook)才放到取餐区(secondary)就像快递员按门铃(中断),你通过猫眼(60h端口)确认是谁(扫描码),再决定要不要开门(处理输入)与CPU通信,核心流程包括:扫描码获取、ASCII码转换、缓冲队列管理。这就像摩斯密码本,听到"滴答"(扫描码)得查表才知道是字母A还是数字1。通过将输入字符同时写入write_q实现,形成"输入→显示"闭环。把室友的输入全变成星号,就像密码输入框那样!就像你打字时屏幕实时显示,其实是系统在对你"复读"

n40404的博客 450

硬件作品3----STM32F103RCT6最小系统板MCU配置

电路未调试成功,目前刚打板,后续需要补充或者改版另行注明。

weixin_58364194的博客 5561

Windows10 修改键位映射

总目录1、为什么要修改键位2、我的计划3、执行步骤第1步:打开注册表编辑器第2步 创建映射文件第3步 添加映射4、如何让某个键失效?5、如何撤销更改?6、附录 键位表 1、为什么要修改键位 我的笔记本键盘上下键是这样的: 很想捶死产品经理,你是从来不适用上下键来调整光标吗?这么设计经常按错好不好! 2、我的计划 众所周知,Shift键在键盘上有左右两个,并且右侧那个shift一百年也不用一次 因...

不识不知的博客 8万+

从零到一:Qt与PCL的跨平台开发环境搭建全攻略

本文详细介绍了从零开始搭建Qt与PCL跨平台开发环境的完整流程,涵盖Windows、Linux和macOS三大平台。重点解析了Qt5与Qt6版本选择、PCL库安装配置、VTK集成等关键技术要点,并提供跨平台CMake项目模板和常见问题解决方案,助力开发者快速构建三维点云处理应用。

weixin_29280657的博客 383

跨厂商网络设备的RADIUS认证:Windows NPS的兼容性与最佳实践

本文详细探讨了Windows NPS在多厂商网络环境中的RADIUS认证实践,特别针对华为、华三、思科等主流设备的兼容性问题提供解决方案。从基础配置到高级优化,涵盖VSA属性映射、认证协议选择及安全加固措施,帮助企业实现统一身份认证并提升网络安全性。

weixin_29213827的博客 421

修改键盘的按键攻略

修改键盘的按键攻略(其一) 1打开注册表 按“win+R”或者点击开始菜单,找到运行,在运行输入框里面输入“regedit”,如下图所示: 2进入Keyboard Layout 这个路径: 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout 3修改Scancode Map 鼠标右键点击Scancode Map,然后点击修改,进入该页面: 如果没有Scancode Map,请新建 修改时,注意以下几点: ①红

weixin_40833551的博客 9991

ADS入门学习笔记——射频振荡器的设计

振荡器是射频系统中的基本部件之一,可以将直流功率转换为射频功率,在特定的频率点建立起稳定的正弦振荡,成为所需的射频信号源。

weixin_42126696的博客 8948

bat修改文件内容_键盘键位修改及管理(Windows篇)

不知道大家生活中有没有遇到这些情况:键盘上某个比较重要的键损坏或失灵而要重新更换键盘,或者在一些游戏、办公软件重的一些默认按键不合理,又或者希望自己DIY出一套属于自己的键位布局。那么我想这篇文章对你会很有帮助。前几个月因心血来潮想尝试一些其他键位布局(例如Dvorak、Norman、Colemak等),需要修改键盘键位。其实,修改键位的方法也有很多,比较常见的是安装第三方辅助软件修改键位映射和功...

weixin_39974400的博客 1404

LTX-2.3 V1.6:8G显存本地AI视频生成工具与int8量化加速实践

这次我们来看一个本地部署的AI视频生成工具——LTX-2.3文字图片生成带音频视频工具V1.6版本。这个工具最大的特点是支持int8量化加速,相比原版提速2-4倍,效果更好,而且8G显存就能运行,不需要搭建复杂环境,解压即可使用。 对于想要在本地电脑上快速生成带音频视频内容的用户来说,这个工具解决了几个关键痛点:首先是硬件门槛低,8G显存意味着大多数主流游戏显卡都能胜任;其次是部署简单,避免了Python环境配置、依赖包冲突等常见问题;最后是性能优化明显,int8加速让生成速度大幅提升。 本文会重点演示如何

hqmln的博客 1234

【电磁场计算】磁偶极子在外磁场中的受力

最近在总结电磁场计算公式的时候发现,关于磁偶极子受力的计算公式,在不同文献中的说明有点出入,在此特地写一篇博客澄清一下。

sky4403的博客 7466

cmd换行 windows_键盘键位修改及管理(Windows篇)

不知道大家生活中有没有遇到这些情况:键盘上某个比较重要的键损坏或失灵而要重新更换键盘,或者在一些游戏、办公软件重的一些默认按键不合理,又或者希望自己DIY出一套属于自己的键位布局。那么我想这篇文章对你会很有帮助。前几个月因心血来潮想尝试一些其他键位布局(例如Dvorak、Norman、Colemak等),需要修改键盘键位。其实,修改键位的方法也有很多,比较常见的是安装第三方辅助软件修改键位映射和功...

weixin_33014989的博客 2135

Claude Code 处理长任务 + Cursor 专注交互:双栈协作的 3 种分工场景与响应提速 35% 实测

揭示 Claude Code 与 Cursor 在 AI 编程中的本质分工:Claude Code 作为离线式架构师处理跨文件、带约束的长链路重构(如单体拆微服务),Cursor 作为现场交互工程师专注秒级局部编辑;提出按任务切片动态切换的三种工程化协作场景,并给出结构化上下文构建、约束型 Prom

weixin_28728443的博客 123

游戏玩家必看:用SharpKeys打造专属键位配置

作为一名资深游戏玩家,我经常遇到不同游戏键位冲突的问题。SharpKeys是一款开源的键盘映射工具,能够将键盘上的任意按键重新映射到其他按键。它通过修改Windows注册表实现键位映射,支持保存多种配置方案,切换起来非常方便。经过一段时间的使用,SharpKeys彻底解决了我切换游戏时的键位困扰。,在这里可以快速体验各种游戏配置方案。我实际使用后发现,从创建项目到部署运行整个过程非常流畅,特别适合想要快速验证想法的游戏开发者。为RPG游戏创建组合键,比如Shift+1映射为F1,实现更多快捷操作。

CrystalwaveEagle34的博客 978

杰理JL703N的SDK内部MIDI 音色库功能使用教程

本文介绍了MIDI琴按键解码和MIDI文件解码的实现方法。MIDI琴解码通过audio_dec_midi_ctrl.c文件实现,MIDI文件(mfa格式)解码则使用audio_dec_midi_file.c。使用前需将音色文件存放在SD卡或内置flash中(需确保四字节对齐),并在download.c中配置路径。同时需在板级配置中将FLASH设置为16Mbit以解决编译问题。关键注意事项包括音色文件的文件夹结构对齐要求和MIDI数据流的正确配置。

qq_42014563的博客 390

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

开发者效率革命:从原理到实践,打造专属键位绑定工作流

键位绑定(Keybindings)是提升人机交互效率的核心技术,其本质是将用户的操作意图与物理输入设备进行最优映射。从底层原理看,它通过减少认知负荷和物理操作路径,直接提升了工作流的流畅度。在工程实践中,一套精心设计的键位方案能显著减少编辑器与命令行等核心工具间的上下文切换耗时,其技术价值体现在将重复性操作固化为肌肉记忆,从而释放更多的认知资源用于创造性工作。应用场景广泛覆盖代码编辑、终端操作、构建测试等日常开发环节。本文以VS Code、终端配置为例,深入探讨如何基于人体工学原则,系统设计并实施一套高效、

weixin_30632089的博客 355

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Blender 3.6 键位映射教程:实现Unity式视图导航,无缝衔接游戏引擎操作习惯

在三维软件和游戏引擎领域,键位映射与操作逻辑是影响用户体验和工作效率的核心要素。其原理在于通过修改软件输入系统底层的事件绑定关系,将用户熟悉的操作模式移植到新平台。这项技术的价值在于显著降低软件学习成本,提升跨平台工作流的一致性,尤其对于需要频繁切换工具的3D艺术家和开发者而言至关重要。在应用场景上,它广泛适用于从Unity、Unreal Engine等游戏引擎转向Blender等建模软件的用户迁移过程。本文聚焦于Blender 3.6,详细解析如何通过精准的键位映射,将默认的视图导航操作无缝替换为游戏开发

weixin_33898876的博客 326

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

如何为Piantor键盘创建自定义键位映射:从基础层到宏功能的完整教程

Piantor键盘是一款专为人体工学设计的42键或36键分体式机械键盘,采用RP2040微控制器,支持多种固件方案。本文将为您提供从基础层配置到高级宏功能的完整键位映射教程,帮助您打造个性化的输入体验。😊 ## 什么是Piantor键盘? Piantor键盘是一款基于Cantor键盘设计的初学者友好型分体式机械键盘。它采用42键或36键布局,支持低剖面Choc V1开关,无需二极管设计让焊接

gitblog_00408的博客 460

Windows 11终极指南:彻底解决QMK固件编译环境配置难题

如果你是一名机械键盘爱好者或开发者,想要在Windows 11系统上编译QMK固件来定制自己的键盘布局,那么这篇文章正是为你准备的。QMK作为开源键盘固件的标杆,支持Atmel AVR和Arm USB系列控制器,但Windows 11用户在编译过程中经常会遇到各种环境配置问题。本文将为你提供完整的解决方案,让你轻松搭建QMK编译环境。 ## 🔍 问题根源深度剖析:为什么Windows 11编译

gitblog_01050的博客 399

开发者键盘配置指南:多模连接、键位定制与问题排查

键盘作为人机交互的核心输入设备,其工作原理是将物理按键动作转换为操作系统可识别的扫描码与键值。在软件开发领域,稳定的输入体验直接影响编码效率与工作流顺畅度。通过理解有线、蓝牙、2.4G等多模连接的技术特性,开发者可针对不同场景选择最优连接方案,确保远程调试、多设备切换时的可靠性。键位映射与宏编程则进一步释放了键盘的定制潜力,允许将常用命令(如Git操作、调试语句)绑定至特定按键,显著减少重复输入。本文以CHERRY键盘为例,深入探讨如何在Windows、macOS、Linux系统中配置驱动、排查蓝牙断连及I

weixin_33834075的博客 563

GlazeWM:Windows平铺窗口管理利器

平铺窗口管理器通过算法自动排列应用窗口,相比传统层叠窗口可提升40%以上的屏幕空间利用率,尤其适合需要同时操作多个终端、IDE和浏览器的开发者。GlazeWM作为Windows平台的轻量级解决方案,完美复刻了Linux下i3wm的核心操作逻辑,支持主从式、网格和标签式三种经典布局模式。通过Win+方向键等高效快捷键体系,配合YAML格式的易读配置文件,开发者能快速构建多工作区协作环境。实测在4K显示器上,合理配置的GlazeWM可同时舒适展示3-4个工作区,显著提升WSL2开发、多屏协作等场景下的工作效率。

weixin_33797791的博客 380

Claude Code v2.1.238 更新解析:readline 键位与 headersHelper 提升 AI 编程体验

在 AI 辅助编程领域,提升开发效率与交互体验是核心诉求。其原理在于通过智能工具理解开发者意图,在编码工作流中提供精准辅助。这带来了显著的技术价值:减少重复劳动、加速问题排查并优化代码质量。典型的应用场景包括代码补全、调试、API 集成以及自动化任务执行。Claude Code 作为深度集成于 IDE 的 AI 助手,其最新 v2.1.238 版本正是围绕这些价值进行优化。本次更新重点引入了 **readline 键位支持**,让习惯命令行操作的开发者能使用高效快捷键编辑提示词,大幅提升输入效率。同时,新增

weixin_34345753的博客 411

自己制作 的 豆包语音助手,配合PC端使用

自己拿AI分析,所有东西都固定了,自己拿 AI 调,会自动生成ICO图标。

csdn_life18的博客 724

如何从Marko 5迁移到Marko 6?Tags API对照表与互操作层的完整迁移清单

Marko 是一个基于声明式 HTML 的 Web 应用开发语言,让构建网页应用变得轻松有趣。Marko 6 用全新的 **Tags API**(`<let>`、`<const>`、标签变量、函数式事件属性)取代了 Marko 5 的 **Class API**(`class {}` 块、`component.js`、`this.state`、`this.emit`),且两者**不向后兼容**——

gitblog_00666的博客 653

PIME:用Python和Node.js轻松开发Windows输入法的终极指南

PIME是一个强大的开源项目,它让开发者能够使用Python和Node.js轻松创建Windows输入法。无论你是输入法开发新手还是有经验的开发者,PIME都能提供简单高效的解决方案,帮助你快速实现个性化的输入法工具。 ## 什么是PIME? PIME(Python Input Method Editor)是一个跨平台的输入法开发框架,特别针对Windows系统优化。它允许开发者使用熟悉的Py

gitblog_01151的博客 395

Windows 11下QMK固件编译完全指南:彻底解决WMIC缺失问题

QMK固件编译是自定义机械键盘的核心环节,但许多Windows 11用户在尝试编译时会遇到"wmic不是内部或外部命令"的错误。本文将深入分析这一问题的根本原因,并提供多种解决方案,帮助您顺利完成QMK固件编译。 ## 🔍 问题现象与诊断 当您在Windows 11系统上执行`make`命令编译QMK固件时,可能会遇到以下错误: ``` 'wmic' 不是内部或外部命令,也不是可运行的程序

gitblog_00879的博客 847
上一篇: 我的美学价值观
下一篇: 【DX12】DirectX Math库 Vector和Matrix类型 XMVECTOR、XMMATRIX
QZQmmmm
博客等级 码龄11年 77粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值