吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6136|回复: 60
收起左侧

[原创工具] 【C++】禁用/启用笔记本键盘工具(含源码)

  [复制链接]
BIGOcean 发表于 2021-5-30 18:43
本帖最后由 BIGOcean 于 2021-6-4 00:09 编辑

前言

工具需要以管理员方式启动">工具需要以管理员方式启动

由于本人测试时电脑均获得了管理权限(默认以管理员运行),导致正常用户无法正常使用软件,抱歉。

已经重新打包工具,可以重新下载工具了。

之所以写这个程序,是因为宿舍桌子太小。有时把外接键盘叠在笔记本键盘上,容易误触到笔记本键盘:fuck
从而导致一些莫名其妙的问题困扰自己。
于是找了些资料了解到了如何禁用笔记本键盘的方法:

+ 禁用设备法。详细教程请点击 [这里](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()


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

成品

运行截图

2
3

下载蓝奏云 访问码: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;
}

尾声

由于本人刚接触注册表操作的相关知识,有大佬能够指点最好不过。
朋友们不要白piao啊~(哭了)

免费评分

参与人数 20吾爱币 +24 热心值 +17 收起 理由
moos在撒人 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xfqm + 1 + 1 我很赞同!
watermelonZL + 1 谢谢@Thanks!
Loksr1 + 1 + 1 我很赞同!
辞义. + 1 + 1 谢谢@Thanks!
samuaicc + 1 + 1 大佬666
zhoumeto + 1 + 1 谢谢@Thanks!
wingking + 1 + 1 用心讨论,共获提升!
qiu1017830825 + 1 热心回复!
Kevin-K + 1 我很赞同!
aisichen + 1 + 1 我很赞同!
明月相照 + 1 + 1 黑PIAO支持!
dreamcrazy + 1 + 1 我很赞同!
正牌璇 + 1 热心回复!
HawnHan + 1 + 1 谢谢@Thanks!
薇尔莉特 + 1 + 1 谢谢@Thanks!
feng7019 + 1 + 1 用心讨论,共获提升!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
_paopao + 1 + 1 谢谢@Thanks!
sam喵喵 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| BIGOcean 发表于 2021-5-31 13:17
本帖最后由 BIGOcean 于 2021-6-1 11:53 编辑
mormas 发表于 2021-5-31 09:46
已安装VC++2015运行库,可还是报错呢

已经重新打包工具,抱歉。https://bigocean.lanzoui.com/iBFCnpn58lc
密码:ocean
HawnHan 发表于 2021-6-10 16:17
早之前看到就收藏了,今天终于排上用场,很好用,第一次没有成功就是因为没有用管理员权限,后来想起要对注册表进行操作需要管理员权限,成功了
 楼主| BIGOcean 发表于 2021-6-3 23:26
辞义. 发表于 2021-6-3 22:44
打开之后禁用完没提示让重启,键盘还能用,管理员权限运行了一下,报错如下
已为您查询到该笔记本当前键盘 ...

目前的测试者(室友们的电脑)的测试结果都是没问题的啊,因为这个工具更改的方式很简单,就是简单的修改注册表的值。
根据你提示的错误信息“当前设备状态未知”,很可能是你输入时出现了一些错误导致的,比如你不小心点了小数点?或者字母一类的,导致赋值错误。你可以重新通过工具开启键盘,或者手动开启:打开注册表:win+r 键入:regedit 回车
位置:计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt
修改Start的值为:
4为禁用
3为开启
 楼主| BIGOcean 发表于 2021-5-31 09:38
yuleniwo 发表于 2021-5-31 08:26
有没有禁用笔记本鼠标那个托盘的?

触摸板一般都有快捷键禁用的,如果没有的话,我找时间看看

免费评分

参与人数 1热心值 +1 收起 理由
hao7 + 1 我很赞同!

查看全部评分

hjt1999 发表于 2021-5-30 18:48
之前有找过相关的禁用方法,小工具很实用 谢谢!
canghaisui 发表于 2021-5-30 18:50
谢谢楼主分享,原创作品要支持一下
 楼主| BIGOcean 发表于 2021-5-30 18:55
。。吾爱这markdown不太行啊,我typora上打的好好的,上传来乱糟糟的。
sam喵喵 发表于 2021-5-30 19:18
感谢分享,期待后续作品。带源码必赞!
guang23333 发表于 2021-5-30 19:23
太强了,。
jjl 发表于 2021-5-30 19:46
实用小工具,收藏感谢分享
_paopao 发表于 2021-5-30 20:14
感谢分享 实用工具
十一不是一 发表于 2021-5-30 22:17
感谢提供方法
daodao9486 发表于 2021-5-30 22:48
学习一下。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 提醒:禁止复制他人回复等『恶意灌水』行为,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-28 18:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表