96SEO 2026-02-20 08:25 0
https://blog.csdn.net/qq_59075481/article/details/136104444。

键盘扫描码映射表这个方法本质上是利用微软提供的注册表设置来达到屏蔽的效果。
这确实在前一阶段是较好的解决方案所以在更新完前两种方案后我不打算对这个方法避而不谈相反我觉得该方法可以用于更广泛的方面甚至许多键盘快捷键修改程序就利用了类似的方法。
本文将就具体的实现细节给出通用修改工具以及谈谈这种方法存在优缺点。
工具有两个一个是我重写的
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard
这个值项可实现对键盘按键的映射。
这里映射的意思可理解为“替换”可将任意一键替换成其它键或者禁用。
00,00,00,00,00,00,00,00,02,00,00,00,01,00,
图片来源https://www.bilibili.com/read/cv8001022/
那么如何通过代码来实现修改呢很简单就是读取注册表和修改注册表只不过需要按照字节序构建数据。
此处填写要修改的总数当然程序写入注册表时按照规则注册表的记录总数比用户实际修改的个数多加1这在之前也介绍过。
解析注册表中重映射按键的数据该方法会逆编码原始按键名称不过目前未实现区分左右按键/setremap
configFilePath指定一个路径作为配置文件路径配置文件按照规范书写程序将解析配置文件并用该配置文件覆盖注册表按键映射表/queryActiveKey动态查询键盘输入的按键的扫描码不区分左右按键这点需要改进/deleteAllMap删除整个注册表按键映射表恢复系统默认配置需要二次确认操作。
注意该操作无法撤销删除/modifyDelKey删除注册表按键映射表中指定的条目。
该命令首先解析所有条目信息随后通过输入要删除的
编号之后添加新的数据条目。
需要手动输入三个参数第一个为原始按键扫描码第二个为修改后的按键扫描码第三个为
编号/modifyAddKey不需要指定位置编号在结尾追加新的条目。
/statusMap
bEnable启用或禁用重映射键注册表项该操作通过将映射表标记为
表示启用/makebackup备份注册表当前重映射表数据。
该命令拷贝一个按照时间记录的注册表副本。
/recoverMap
backupTime恢复按照时间标签备份的副本该操作将覆盖当前的注册表按键映射表。
/readbackup读取所有注册表备份按照时间标签列表显示
完整代码如下注意所有的修改除了备份数据其他操作对于大部分应用需要重启计算机生效
LSYSTEM\\CurrentControlSet\\Control\\Keyboard
CONFIG_FILE_SECTION_REMAP_KEY_NUM
CONFIG_FILE_SECTION_MAP_KEY_RANK
CONFIG_FILE_SECTION_MAP_KEY_ORI_CODE
CONFIG_FILE_SECTION_MAP_KEY_NEW_CODE
std::vectorstd::pairstd::string,
ParseRemapInfo(std::vectorstd::pairWORD,
(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
4);remapInfo.emplace_back(originalScanCode,
remappedScanCode);}}RegCloseKey(hKey);return
EnumerateRemappedKeys(std::vectorstd::pairWORD,
sizeof(remappedKeyName));memset(originalKeyName,
sizeof(originalKeyName));originalScanCode
remapInfo[i].first;remappedScanCode
GetKeyNameTextA(remappedScanCode
sizeof(*remappedKeyName));oldKeyret
GetKeyNameTextA(originalScanCode
(line.find(CONFIG_FILE_SECTION_REMAP_KEY_NUM)
循环绕过多行注释或空行do{std::getline(file,
totalRemappedKeys;originalScanCodes.reserve(totalRemappedKeys);newScanCodes.reserve(totalRemappedKeys);}else
(line.find(CONFIG_FILE_SECTION_MAP_KEY_ORI_CODE)
static_castWORD(std::stoi(hexCode,
0xFF);originalScanCodes.push_back(theCode);}else
(line.find(CONFIG_FILE_SECTION_MAP_KEY_NEW_CODE)
static_castWORD(std::stoi(hexCode,
0xFF);newScanCodes.push_back(theCode);}}if
写入数据到向量结构中*(WORD*)(buffer.data()
newScanCodes[i];*(WORD*)(buffer.data()
(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
Map.\n;}RegCloseKey(hKey);}else
reinterpret_castKBDLLHOOKSTRUCT*(lParam);if
(GetKeyNameTextA(kbStruct-scanCode
{keyNameValuePairs.emplace_back(keyName,
\n;}keyNameValuePairs.clear();remainingKeys
SetWindowsHookExW(WH_KEYBOARD_LL,
{TranslateMessage(msg);DispatchMessage(msg);}//
卸载钩子UnhookWindowsHookEx(keyboardHook);
(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
keys.\n;}RegCloseKey(hKey);}else
(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
sysTime;GetLocalTime(sysTime);std::wstringstream
backupKeyNameStream;backupKeyNameStream
backupKeyNameStream.str();std::vectorBYTE
(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
移动到下一个值项index;}RegCloseKey(hKey);}else
(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
std::endl;}RegCloseKey(hKey);}else
remapInfo[i].second;*(WORD*)(buffer.data()
(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
true;}RegCloseKey(hKey);}return
DeleteRemapItemByIndex(std::vectorstd::pairWORD,
枚举原有数据EnumerateRemappedKeys(remapInfo);std::cout
索引从1开始转换为从0开始}std::vectorstd::pairWORD,
(std::find(deleteIndices.begin(),
{updatedRemapInfo.push_back(remapInfo[i]);}}if
(UpdateRemapInfo(updatedRemapInfo))
AddRemapItemByIndex(std::vectorstd::pairWORD,
dwIdToInsert;remapInfo.insert(it,
(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
disabledKeyNameStream;std::wstringstream
checkKeyNameStream;disabledKeyNameStream
DESABLED_KEY_PREFIX);std::wstring
disabledKeyNameStream.str();checkKeyNameStream
disabledKeyName.c_str());}}else
L\0);MultiByteToWideChar(CP_UTF8,
解析目前注册表中重映射键值的数据std::vectorstd::pairWORD,
{EnumerateRemappedKeys(remapInfo);}else
argv[2];ModifyRemappedKeys(configFile);}else
动态查询按键的扫描码QueryScanCodeForKey();}else
删除所有重映射键数据{DeleteAllRemappedKeys();}else
删除指定的重映射键数据std::vectorstd::pairWORD,
{DeleteRemapItemByIndex(remapInfo);}else
在指定的元素后面添加新的按键映射{std::vectorstd::pairWORD,
枚举原有数据EnumerateRemappedKeys(remapInfo);//
写入数据AddRemapItemByIndex(remapInfo,std::make_pair(oldScanCode,
在映射表的末尾追加按键映射{std::vectorstd::pairWORD,
写入数据AddRemapItemByIndex(remapInfo,std::make_pair(oldScanCode,
Key.\n;ChangeScancodeMapStatus(TRUE);}else
Key.\n;ChangeScancodeMapStatus(FALSE);}}else
备份当前注册表重映射键数据BackupScancodeMap();}else
ConvertToWideString(argv[2]);if
1;RestoreBackupScancodeMap(backupTime);}else
读取备份文件列表EnumerateAndPrintBackupKeys();}else
是一个不错的选择它具有完备的查询、修改、删除等功能我的程序一定程度上参考了他的思路。
网盘下载链接https://pan.baidu.com/s/1Dxn8R3GEdol59ObYAMTLHw?pwdvtq3
官网程序下载链接https://www.medo64.com/download/scancodemap111.exe。
键的方法。
浅谈了该方法的利弊。
修改注册表屏蔽该按键的方法还有另外一个稳定的方法就是利用
项隐藏相应的选项这个方法也是以前讨论最多的方法比按键扫描码用的还广泛还有一个就是进程冻结法。
但是都有缺点比如可以注册表方法是可以轻易恢复的进程冻结存在不稳定性冻结后容易让进程陷入
https://blog.csdn.net/qq_59075481/article/details/136104444。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback