前言

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



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

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

+ 禁用设备法。详细教程请点击**[`这里`](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. 12.VUE - v-bind 详解

    v-bind指令用于给html标签设置属性. <!-- 完整语法 --> <a v-bind:href="url"></a> <!-- 缩 ...

  2. 善用k8s explain

    使用kubectl explain来快速了解用法 例如 kubectl explain deployment.spec 或 kubectl explain deployment.spec.strate ...

  3. 1027 Colors in Mars

    People in Mars represent the colors in their computers in a similar way as the Earth people. That is ...

  4. flex 弹性盒模型的一些例子;

    1.垂直居中 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  5. 【ShardingSphere】ShardingSphere学习(三)-数据分片-分片

    分片键 分片算法 分片策略 SQL Hint 分片键 用于分片的数据库字段,是将数据库(表)水平拆分的关键字段.例:将订单表中的订单主键的尾数取模分片,则订单主键为分片字段. SQL中如果无分片字段, ...

  6. hdu2489-DFS+最小生成树

    题意:       给你n个点,和任意两点的距离,让你在这N个点中找到一个有m个点并且ratio最小的树.                         ratio = sum(edge) / su ...

  7. POJ2406 KMP前缀周期

    题意:       给你一个字符串,长度小于1百万,问你他最多可以拆成集合相同字符串,例如abcabcabc 可以拆成3个abc,所以输出3. 思路:       这个是比较常规的next应用,首先假 ...

  8. DVWA之Command Injection

    Command Injection Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的.PHP命令注入攻击漏洞是PHP应用程序中常见 ...

  9. UVA11992不错的线段树段更新

    题意:       给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v  把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v  把子矩阵的值全部都变成v 2 x ...

  10. [CTF]当铺密码

    [CTF]当铺密码 ---------------------  作者:adversity`  来源:CSDN  原文:https://blog.csdn.net/qq_40836553/articl ...