前言

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



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

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

+ 禁用设备法。详细教程请点击**[`这里`](https://jingyan.baidu.com/article/77b8dc7fb9aa336175eab674.html)**
+ 修改注册表法。详细教程请点击**[`这里`](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)打开一个键

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

(2)查询某一个键值

RegQueryValueEx

    函数定义:LONG RegQueryValueEx(HKEY hKey,//要查询的键的句柄

                                   LPCTSTR lpValueName,//要查询的键值的名称

                                   LPDWORD lpReserved,//保留值

                                   LPDWORD lpType,//要查询的数据的类型

                                   LPBYTE lpData,//要返回的查询的数据

                                   LPDWORD lpcbData//预置的数据的长度

                                  );

(3)设置一个键值

RegSetValueEx

    函数定义:LONG RegSetValueEx(HKEY hKey,//要设置的键的句柄

                                 LPCTSTR lpValueName,//要访问的键值的名称

                                 LPDWORD lpReserved,//保留值

                                 DWORD dwType,//要设置的数据的类型

                                 const BYTE *lpData,//要设置的健值

                                 DWORD cbData//数据的长度

                                );

(4)新建指定键

RegCreateKey

函数定义:LONG RegCreateKey (HKEY  hkey, // 要打开键的句柄

LPCTSTR lpsubkey, // 要打开子键的名字的地址

PHKEY phkresult // 已打开句柄的缓存区的地址

);

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

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

(5.2)删除注册表项

LONG RegDeleteKey(HKEY hKey,        //已打开的键的句柄

LPCTSTR lpSubKey //要删除的子键或路径

);

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

特别声明

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

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

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

**

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

**

成品

运行截图



下载

蓝奏云 访问码:ocean

源码

#include <iostream>
#include <atlbase.h>
#include <Windows.h>
using namespace std;
void write_dword(); //测试成功,读取到start的当前值//读取操作表,其类型为DWORD
void read_dword(){
HKEY hKEY;//定义有关的键,在查询结束时关闭
//打开与路径data_Set相关的hKEY
char i,x; LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt"); //访问注册表,hKEY则保存此函数所打开的键的句柄
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_READ, &hKEY)){
DWORD dwValue;//长整型数据,如果是字符串数据用char数组
DWORD dwSize = sizeof(DWORD);
DWORD dwType = REG_DWORD; if (::RegQueryValueEx(hKEY, _T("Start"), 0, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
cout << "错误:无法查询有关的注册表信息" << endl; switch (dwValue){
case 3:
cout << "当前笔记本键盘状态为:启用 " << "(" << hex << dwValue << ")" << endl << endl << "若需要禁用请输入字母:y或Y" << endl;
cin >> i;
if (i == 'y'|| i == 'Y') {
write_dword();
}
break;
case 4:
cout << "当前笔记本键盘状态为:禁用 " << "(" << hex << dwValue << ")" << endl << endl << "若需要启用请输入字母:y或Y" << endl;
cin >> x;
if (x == 'y' || x == 'Y') {
write_dword();
}
break;
default:
cout << "当前笔记本键盘状态获取未知 " << "(" << hex << dwValue << ")" << endl << endl;
break;
}
}
::RegCloseKey(hKEY);
} //测试成功,读取到start设备名displayname//读取操作表,其类型为REG_SZ
void read_reg_sz(){
HKEY hkey;
LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt"); if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_READ, &hkey)){
char dwValue[256];
DWORD dwSzType = REG_SZ;
DWORD dwSize = sizeof(dwValue);
if (::RegQueryValueEx(hkey, _T("DisplayName"), 0, &dwSzType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS){
cout << "无法查询有关的注册表信息" << endl << endl;
}
cout << "当前设备名:" << dwValue << endl << endl;
}
::RegCloseKey(hkey);
} //测试成功,更改(创建)到start键值//在SYSTEM\CurrentControlSet\Services\i8042prt文件夹下读取Start的子键,设置其值为dwValue
void write_dword(){
HKEY hkey;//定义有关的hkey,在查询结束时要关闭
HKEY hTempKey; char ans;
int flag; DWORD dwValue;
DWORD dwSize = sizeof(DWORD);
DWORD dwType = REG_DWORD; LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt"); cout << "请设置当前笔记本键盘状态,输入数字:3,表示开启键盘;输入数字4,表示禁用键盘;" << endl;
cin >> flag;
switch (flag) {
case 3:
dwValue = flag; break;
case 4:
dwValue = flag; break;
default:
cout << "状态值输入错误" << endl; break;
}
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
//if (ERROR_SUCCESS == ::RegCreateKey(hkey, _T("解开该段落注释,则可更改为:在SYSTEM\\CurrentControlSet\\Services\\i8042prt下,创建以'该文本内容'为名称的子健,并创建一个名为“Start”的子健,其值为:dwValue"), &hTempKey)){
if (ERROR_SUCCESS != ::RegSetValueEx(hkey, _T("Start"), 0, REG_DWORD, (CONST BYTE*) & dwValue, sizeof(DWORD))){
cout << "写入注册表失败" << endl;
}
cout << "修改成功!" << endl << "是否立刻重启电脑,使设置立即生效?" << endl << "输入y或Y,以立刻重新启动电脑;输入n或N退出程序" << endl;
cin >> ans;
if (ans == 'y' || ans == 'Y') {
cout << "再次确认,要立刻重启电脑吗?\n\n输入y或Y,以立刻重新启动电脑;输入n或N退出程序" << endl;
cin >> ans;
if (ans == 'y' || ans == 'Y')
system("shutdown -r -t 0");
}
else
exit(1);
//}
}
::RegCloseKey(hkey);
} //测试成功,更改(创建)子键test111及其键值项Name到start键值
void write_binary(){
HKEY hkey;
HKEY hTempKey;
BYTE m_name[10];
memset(m_name, 0, sizeof(m_name));
m_name[0] = 0xff;
m_name[1] = 0xac;
m_name[2] = 0x05;
m_name[3] = 0x4e; LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
if (ERROR_SUCCESS == ::RegCreateKey(hkey, _T("test111"), &hTempKey)){
if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_BINARY, (unsigned char*)m_name, 5)){
cout << "写入错误" << endl;
}
}
}
::RegCloseKey(hkey);
} //测试成功,更改(创建)子键test111及其键值项Name到start键值
void write_reg_sz(){
HKEY hkey;
HKEY hTempKey;
char m_name_set[256] = "China"; DWORD len = strlen(m_name_set) + 1;
LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
if (ERROR_SUCCESS == ::RegCreateKey(hkey, _T("test111"), &hTempKey)){
if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_SZ, (const BYTE*)m_name_set, len)){
cout << "写入错误" << endl;
}
}
}
::RegCloseKey(hkey);
} //测试成功,将键值项Name删除
void delete_value()
{
HKEY hkey;
LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt\\test111"); if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey))
{
if (ERROR_SUCCESS != ::RegDeleteValue(hkey, _T("Name")))
{
cout << "删除错误" << endl;
}
}
::RegCloseKey(hkey);
} //测试成功,将子键test111删除
void delete_key(){
HKEY hkey;
LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt"); if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
if (ERROR_SUCCESS != ::RegDeleteKey(hkey, "test111")){
cout << "删除错误" << endl;
}
}
::RegCloseKey(hkey);
} void menu(){
cout << "欢迎使用本工具" << endl << endl;
read_reg_sz();
cout << endl << "已为您查询到该笔记本当前键盘状态为:" ;
read_dword();
} int main(){
menu();
system("pause");
return 0;
}

尾声

**

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

**

【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. Spring Boot demo系列(八):Swagger

    2021.2.24 更新 1 概述 Swagger主要用于生成API文档,本文演示了如何使用目前最新的OpenAPI3以及Swagger来进行接口文档的生成. 2 依赖 <dependency& ...

  2. 痞子衡嵌入式:i.MXRT中FlexSPI外设对AHB Burst Read特性的支持

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是FlexSPI外设对AHB Burst Read特性的支持. 痞子衡之前写过一篇关于FlexSPI LUT的文章 <从头开始认识i ...

  3. python进阶(17)协程

    协程 协程(Coroutine),又称微线程,纤程.(协程是一种用户态的轻量级线程)   作用:在执行 A 函数的时候,可以随时中断,去执行 B 函数,然后中断B函数,继续执行 A 函数 (可以自动切 ...

  4. Ubuntu 快速安装Gitlab-ce

    1.下载并安装gitlab,下载地址: https://packages.gitlab.com/gitlab/gitlab-ce/ sudo dpkg -i gitlab-ce_12.0.3-ce.0 ...

  5. vagrant构建centos虚拟环境

    vagrant搭建centos 什么是vagrant 如何使用 1.构建本地的目录 2.官方下载对应的镜像文件,官方下载地址 3.导入刚刚下载的镜像(box文件) 4.初始化 5.修改Vagrantf ...

  6. 01- QTP快速入门

    QTP概述 QTP安装流程

  7. hdu3585 二分最大团(dp优化)

    题意       给你一些点( <= 50),让你找到k个点,使得他们之间的最小距离最大. 思路:       求最小的最大,我们可以直接二分去枚举距离,但是要注意,不要去二分double找距离 ...

  8. Windows PE第6章 栈与重定位表

    第六章 栈与重定位表 本章主要介绍栈和代码重定位.站和重定位表两者并没有必然的联系,但都和代码有关.栈描述的是代码运行过程中,操作系统为调度程序之间相互调用关系,或临时存放操作数而设置的一种数据结构. ...

  9. Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)

    7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...

  10. 你注意到了吗?修改API文档也需要规范!

    关于API接口文档的内容和格式规范的文章,之前也有写过,网上也有不少写的比我还好的,就不赘述了,今天想说的是一个很容易被忽略的点,修改API文档的规范:版本控制. 示例 拿Eolinker来演示一下流 ...