zoukankan      html  css  js  c++  java
  • 【C++】禁用/启用笔记本键盘工具(含源码)

    前言

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

    fck
    从而导致一些莫名其妙的问题困扰自己。
    于是找了些资料了解到了如何禁用笔记本键盘的方法:

    + 禁用设备法。详细教程请点击**[`这里`](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键值//在SYSTEMCurrentControlSetServicesi8042prt文件夹下读取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 << "再次确认,要立刻重启电脑吗?
    
    输入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;
    }
    
    

    尾声

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

    作者:洪卫

    -------------------------------------------

    个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

    万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!

  • 相关阅读:
    比原空投问答题库题解(一)
    RXD, tree and sequence IN HDU6065
    python爬虫——对爬到的数据进行清洗的一些姿势(5)
    hdu 5934 Bomb
    HDU 3360 National Treasures
    HDU 1845 Jimmy’s Assignment
    HDU 1528 Card Game Cheater
    HDU 1507 Uncle Tom's Inherited Land*
    HDU 1281 棋盘游戏
    WampServer出现You don’t have permission to access/on this server提示
  • 原文地址:https://www.cnblogs.com/BIGOcean/p/14828941.html
Copyright © 2011-2022 走看看