前言

之所以写这个程序,是因为宿舍桌子太小。有时把外接键盘叠在笔记本键盘上,容易误触到笔记本键盘:



从而导致一些莫名其妙的问题困扰自己。

于是找了些资料了解到了如何禁用笔记本键盘的方法:

  1. + 禁用设备法。详细教程请点击**[`这里`](https://jingyan.baidu.com/article/77b8dc7fb9aa336175eab674.html)**
  2. + 修改注册表法。详细教程请点击**[`这里`](https://www.52pojie.cn/thread-1445700-1-2.html)**

可能会有人问:为什么不省事点选用禁用设备法,而是写代码再来操作注册表,来禁用键盘这么麻烦的方法呢?原因很简单,我突然对编程语言操作注册表很感兴趣,就这么做了。

简单介绍注册表

**

注册表结构类似文件目录:分为根键、子键和键值项三部分,与文件目录对应的话就是根目录、子目录和文件。简单介绍一下这三部分:**

(1)根键

分为5个:HKEY_CLASSES_ROOT, HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_USERS和HKEY_CURRENT_CONFIG

(2)子键

可以有多个子键和键值项,就像一个目录中可以有多个子目录和多个文件一样。

(3)键值项

**可以理解为文件,它由三部分组成,分别为 :名称、类型、数据。其中类型主要有:

REG_BINARY 二进制数据

REG_DWORD 32位双字节数据

REG_SZ 以0结尾的字符串

REG_DWORD_BIG_ENDIAN 高位排在底位的双字

REG_EXPAND_SZ 扩展字符串,可以加入变量如%PATH%

REG_LINK UNICODE 符号链接

REG_RESOURCE_LIST 设备驱动程序资源列表

REG_MULTI_SZ 多字符串

注册表数据项的数据类型有8种,最常用的是前3种。

操作注册表的几个API函数

**需要头文件:atlbase.h **

(1)打开一个键

  1. RegOpenKeyEx
  2. 函数定义:LONG RegOpenKeyEx(HKEY hKey,//已经打开的键的句柄,或者直接是上述几个根键
  3. LPCTSTR lpSubKey,//要打开的子键名字的地址
  4. DWORD ulOptions,//保留值,必须为0
  5. REGSAM samDesired,//打开方式,如读还是写
  6. PHKEY phkResult//返回的打开的子键的句柄
  7. );

(2)查询某一个键值

  1. RegQueryValueEx
  2. 函数定义:LONG RegQueryValueEx(HKEY hKey,//要查询的键的句柄
  3. LPCTSTR lpValueName,//要查询的键值的名称
  4. LPDWORD lpReserved,//保留值
  5. LPDWORD lpType,//要查询的数据的类型
  6. LPBYTE lpData,//要返回的查询的数据
  7. LPDWORD lpcbData//预置的数据的长度
  8. );

(3)设置一个键值

  1. RegSetValueEx
  2. 函数定义:LONG RegSetValueEx(HKEY hKey,//要设置的键的句柄
  3. LPCTSTR lpValueName,//要访问的键值的名称
  4. LPDWORD lpReserved,//保留值
  5. DWORD dwType,//要设置的数据的类型
  6. const BYTE *lpData,//要设置的健值
  7. DWORD cbData//数据的长度
  8. );

(4)新建指定键

  1. RegCreateKey
  2. 函数定义:LONG RegCreateKey (HKEY hkey, // 要打开键的句柄
  3. LPCTSTR lpsubkey, // 要打开子键的名字的地址
  4. PHKEY phkresult // 已打开句柄的缓存区的地址
  5. );

(5)删除注册表指定键下的值

  1. LONG RegDeleteValue(HKEY hKey, //子键的句柄
  2. LPCTSTR lpValueName //删除键值的名称
  3. );

(5.2)删除注册表项

  1. LONG RegDeleteKey(HKEY hKey, //已打开的键的句柄
  2. LPCTSTR lpSubKey //要删除的子键或路径
  3. );

RegDeleteKey 也可用来删除一个键值。在 Win 95/98 平台下,也可用来删除整个子键和键值。但是在Windows NT/2000平台下,只能用来删除没有子键的键。

特别声明

+由于修改注册表后,需要重启电脑后才能生效。所以代码中加入了询问“是否立刻重启”的语句

+代码中的部分函数没有必要,仅仅是我练习其他注册表操作功能所写,与代码本身目的毫无关联

无关联函数如下
read_reg_sz();
write_binary()
write_reg_sz()
delete_value()
delete_key()

**

+之所以附上无关联函数,一方面为了以后有机会的话自己再次复习,另一方面是给读者一些启发。我觉得初学者更能懂初学者哈哈,也许其他函数也能够被有兴趣的读者拿来开发出更有价值的内容(工具)。

**

成品

运行截图



下载

蓝奏云 访问码:ocean

源码

  1. #include <iostream>
  2. #include <atlbase.h>
  3. #include <Windows.h>
  4. using namespace std;
  5. void write_dword();
  6. //测试成功,读取到start的当前值//读取操作表,其类型为DWORD
  7. void read_dword(){
  8. HKEY hKEY;//定义有关的键,在查询结束时关闭
  9. //打开与路径data_Set相关的hKEY
  10. char i,x;
  11. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  12. //访问注册表,hKEY则保存此函数所打开的键的句柄
  13. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_READ, &hKEY)){
  14. DWORD dwValue;//长整型数据,如果是字符串数据用char数组
  15. DWORD dwSize = sizeof(DWORD);
  16. DWORD dwType = REG_DWORD;
  17. if (::RegQueryValueEx(hKEY, _T("Start"), 0, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
  18. cout << "错误:无法查询有关的注册表信息" << endl;
  19. switch (dwValue){
  20. case 3:
  21. cout << "当前笔记本键盘状态为:启用 " << "(" << hex << dwValue << ")" << endl << endl << "若需要禁用请输入字母:y或Y" << endl;
  22. cin >> i;
  23. if (i == 'y'|| i == 'Y') {
  24. write_dword();
  25. }
  26. break;
  27. case 4:
  28. cout << "当前笔记本键盘状态为:禁用 " << "(" << hex << dwValue << ")" << endl << endl << "若需要启用请输入字母:y或Y" << endl;
  29. cin >> x;
  30. if (x == 'y' || x == 'Y') {
  31. write_dword();
  32. }
  33. break;
  34. default:
  35. cout << "当前笔记本键盘状态获取未知 " << "(" << hex << dwValue << ")" << endl << endl;
  36. break;
  37. }
  38. }
  39. ::RegCloseKey(hKEY);
  40. }
  41. //测试成功,读取到start设备名displayname//读取操作表,其类型为REG_SZ
  42. void read_reg_sz(){
  43. HKEY hkey;
  44. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  45. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_READ, &hkey)){
  46. char dwValue[256];
  47. DWORD dwSzType = REG_SZ;
  48. DWORD dwSize = sizeof(dwValue);
  49. if (::RegQueryValueEx(hkey, _T("DisplayName"), 0, &dwSzType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS){
  50. cout << "无法查询有关的注册表信息" << endl << endl;
  51. }
  52. cout << "当前设备名:" << dwValue << endl << endl;
  53. }
  54. ::RegCloseKey(hkey);
  55. }
  56. //测试成功,更改(创建)到start键值//在SYSTEM\CurrentControlSet\Services\i8042prt文件夹下读取Start的子键,设置其值为dwValue
  57. void write_dword(){
  58. HKEY hkey;//定义有关的hkey,在查询结束时要关闭
  59. HKEY hTempKey;
  60. char ans;
  61. int flag;
  62. DWORD dwValue;
  63. DWORD dwSize = sizeof(DWORD);
  64. DWORD dwType = REG_DWORD;
  65. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  66. cout << "请设置当前笔记本键盘状态,输入数字:3,表示开启键盘;输入数字4,表示禁用键盘;" << endl;
  67. cin >> flag;
  68. switch (flag) {
  69. case 3:
  70. dwValue = flag; break;
  71. case 4:
  72. dwValue = flag; break;
  73. default:
  74. cout << "状态值输入错误" << endl; break;
  75. }
  76. if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
  77. //if (ERROR_SUCCESS == ::RegCreateKey(hkey, _T("解开该段落注释,则可更改为:在SYSTEM\\CurrentControlSet\\Services\\i8042prt下,创建以'该文本内容'为名称的子健,并创建一个名为“Start”的子健,其值为:dwValue"), &hTempKey)){
  78. if (ERROR_SUCCESS != ::RegSetValueEx(hkey, _T("Start"), 0, REG_DWORD, (CONST BYTE*) & dwValue, sizeof(DWORD))){
  79. cout << "写入注册表失败" << endl;
  80. }
  81. cout << "修改成功!" << endl << "是否立刻重启电脑,使设置立即生效?" << endl << "输入y或Y,以立刻重新启动电脑;输入n或N退出程序" << endl;
  82. cin >> ans;
  83. if (ans == 'y' || ans == 'Y') {
  84. cout << "再次确认,要立刻重启电脑吗?\n\n输入y或Y,以立刻重新启动电脑;输入n或N退出程序" << endl;
  85. cin >> ans;
  86. if (ans == 'y' || ans == 'Y')
  87. system("shutdown -r -t 0");
  88. }
  89. else
  90. exit(1);
  91. //}
  92. }
  93. ::RegCloseKey(hkey);
  94. }
  95. //测试成功,更改(创建)子键test111及其键值项Name到start键值
  96. void write_binary(){
  97. HKEY hkey;
  98. HKEY hTempKey;
  99. BYTE m_name[10];
  100. memset(m_name, 0, sizeof(m_name));
  101. m_name[0] = 0xff;
  102. m_name[1] = 0xac;
  103. m_name[2] = 0x05;
  104. m_name[3] = 0x4e;
  105. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  106. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
  107. if (ERROR_SUCCESS == ::RegCreateKey(hkey, _T("test111"), &hTempKey)){
  108. if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_BINARY, (unsigned char*)m_name, 5)){
  109. cout << "写入错误" << endl;
  110. }
  111. }
  112. }
  113. ::RegCloseKey(hkey);
  114. }
  115. //测试成功,更改(创建)子键test111及其键值项Name到start键值
  116. void write_reg_sz(){
  117. HKEY hkey;
  118. HKEY hTempKey;
  119. char m_name_set[256] = "China";
  120. DWORD len = strlen(m_name_set) + 1;
  121. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  122. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
  123. if (ERROR_SUCCESS == ::RegCreateKey(hkey, _T("test111"), &hTempKey)){
  124. if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_SZ, (const BYTE*)m_name_set, len)){
  125. cout << "写入错误" << endl;
  126. }
  127. }
  128. }
  129. ::RegCloseKey(hkey);
  130. }
  131. //测试成功,将键值项Name删除
  132. void delete_value()
  133. {
  134. HKEY hkey;
  135. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt\\test111");
  136. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey))
  137. {
  138. if (ERROR_SUCCESS != ::RegDeleteValue(hkey, _T("Name")))
  139. {
  140. cout << "删除错误" << endl;
  141. }
  142. }
  143. ::RegCloseKey(hkey);
  144. }
  145. //测试成功,将子键test111删除
  146. void delete_key(){
  147. HKEY hkey;
  148. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  149. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
  150. if (ERROR_SUCCESS != ::RegDeleteKey(hkey, "test111")){
  151. cout << "删除错误" << endl;
  152. }
  153. }
  154. ::RegCloseKey(hkey);
  155. }
  156. void menu(){
  157. cout << "欢迎使用本工具" << endl << endl;
  158. read_reg_sz();
  159. cout << endl << "已为您查询到该笔记本当前键盘状态为:" ;
  160. read_dword();
  161. }
  162. int main(){
  163. menu();
  164. system("pause");
  165. return 0;
  166. }

尾声

**

由于本人刚接触注册表操作的相关知识,有大佬能够指点最好不过。

**

【C++】禁用/启用笔记本键盘工具(含源码)的更多相关文章

  1. 自制小工具含源码——SPTC上海交通卡余额查询

    说明 需求 开发 其他

  2. yum工具及源码包

    目录 yum工具及源码包 yum yum源 yum实战案例 yum全局配置文件 制作本地yum仓库 构建企业级yum仓库 源码包 yum工具及源码包 yum yum是RedHat以及CentOS中的软 ...

  3. linux 软件管理--yum工具及源码包

    目录 linux 软件管理--yum工具及源码包 一.yum基本概述 二.yum源的配置 三.yum实践案例 四.yum全局配置文件 五.yum签名检查机制 五.制作本地yum仓库 六.构建企业级yu ...

  4. 一篇文章看懂TPCx-BB(大数据基准测试工具)源码

    TPCx-BB是大数据基准测试工具,它通过模拟零售商的30个应用场景,执行30个查询来衡量基于Hadoop的大数据系统的包括硬件和软件的性能.其中一些场景还用到了机器学习算法(聚类.线性回归等).为了 ...

  5. 原创:用python把链接指向的网页直接生成图片的http服务及网站(含源码及思想)

    原创:用python把链接指向的网页直接生成图片的http服务及网站(含源码及思想) 总体思想:     希望让调用方通过 http调用传入一个需要生成图片的网页链接生成一个网页的图片并返回图片链接 ...

  6. git工具 将源码clone到本地指定目录的三种方式

      git工具 将源码clone到本地指定目录的三种方式 CreationTime--2018年7月27日15点34分 Author:Marydon 1.情景展示 运行git-bash.exe,输入命 ...

  7. 可视化工具gephi源码探秘(二)---导入netbeans

    在上篇<可视化工具gephi源码探秘(一)>中主要介绍了如何将gephi的源码导入myeclipse中遇到的一些问题,此篇接着上篇而来,主要讲解当下通过myeclipse导入gephi源码 ...

  8. C++ JsonCpp 使用(含源码下载)

    C++ JsonCpp 使用(含源码下载) 前言 JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择JSON的全称为:JavaScri ...

  9. 微信公众平台开发-OAuth2.0网页授权(含源码)

    微信公众平台开发-OAuth2.0网页授权接口.网页授权接口详解(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 在微信开发的高级应用中,几乎都会使用到该接口,因为通过该接口,可以获 ...

随机推荐

  1. Java JFR 民间指南 - 事件详解 - jdk.ObjectAllocationInNewTLAB

    重新申请 TLAB 分配对象事件:jdk.ObjectAllocationInNewTLAB 引入版本:Java 11 相关 ISSUES: JFR: RecordingStream leaks me ...

  2. ASP.NET CORE使用WebUploader对大文件分片上传,并通过ASP.NET CORE SignalR实时反馈后台处理进度给前端展示

    本次,我们来实现一个单个大文件上传,并且把后台对上传文件的处理进度通过ASP.NET CORE SignalR反馈给前端展示,比如上传一个大的zip压缩包文件,后台进行解压缩,并且对压缩包中的文件进行 ...

  3. 分布式锁的实现之 redis 篇

    为什么需要分布式锁 引入经典的秒杀情景,100件商品供客户抢.如果是单机版的话,我们使用synchronized 或者 lock 都可以实现线程安全.但是如果多个服务器的话,synchronized ...

  4. 【JVM】JVM中的垃圾收集器

    垃圾收集器组合 Serial+Serial Old Serial+CMS ParNew+CMS ParNew+Serial Old Paralle Scavenge + Serial Old Para ...

  5. 逆向工程第004篇:跨越CM4验证机制的鸿沟(中)

    一.前言 在上一篇文章的最后,我已经找出了关键的CALL语句,那么这篇文章我就带领大家来一步一步地分析这个CALL.我会将我的思路完整地展现给大家,因此分析过程可能略显冗长,我会分为两篇文章进行讨论. ...

  6. 接口测试的N中玩法

    在我看来接口测试相对其他类型的测试是比较简单的.对于最常见的HTTP接口,只需要知道接口的 URL.方法.参数类型.返回值 ... 就可以对接口进行测试了. apifox 如果你是入门级选手,那么ap ...

  7. 双非硕士的辛酸求职回忆录:第 2 篇 谈谈我是如何同时找到Java、Python、Go等开发岗和国企银行的科技岗位Offer(上篇)

    1. 双非硕士的辛酸求职之旅--谈谈我是如何同时找到Java.Python.Go等开发岗和国企银行的offer 1.1. 秋招最终情况 本人情况:双非硕,意向工作城市广深,Java和Python技术栈 ...

  8. 『动善时』JMeter基础 — 8、JMeter主要元件介绍

    目录 1.测试计划(Test Plan) 2.线程组 3.取样器(sampler) 4.逻辑控制器(Logic Controller) 5.配置元件(Config Element) 6.定时器(Tim ...

  9. Spring的配置文件 (SSM maven项目)

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  10. window 10 删除文件夹需要管理员权限

    如果设了当前的账号有权限删除了, 还是显示删除里管理员则需要改: 按Win+R组合键,输入gpedit.msc点击确定: 在窗口边依次打开计算机配置--Windows设置--安全设置--本地策略--安 ...