operatereg.exe【C++】是一款非常方便筆記本電腦鍵盤(pán)功能禁用腳本,支持開(kāi)啟禁用筆記本鍵盤(pán),需要右鍵以管理員身份運(yùn)行此程序,運(yùn)行后重新啟動(dòng)計(jì)算機(jī)!您還在為老是誤觸而煩惱嗎?
軟件說(shuō)明
之所以寫(xiě)這個(gè)程序,是因?yàn)樗奚嶙雷犹。有時(shí)把外接鍵盤(pán)疊在筆記本鍵盤(pán)上,容易誤觸到筆記本鍵盤(pán),從而導(dǎo)致一些莫名其妙的問(wèn)題困擾自己。
于是找了些資料了解到了如何禁用筆記本鍵盤(pán)的方法:
+ 禁用設(shè)備法。詳細(xì)教程請(qǐng)點(diǎn)擊 [這里](https://jingyan.baidu.com/article/77b8dc7fb9aa336175eab674.html)
+ 修改注冊(cè)表法。詳細(xì)教程請(qǐng)點(diǎn)擊 [這里](https://www.52pojie.cn/thread-1445700-1-2.html)
可能會(huì)有人問(wèn):為什么不省事點(diǎn)選用禁用設(shè)備法,而是寫(xiě)代碼再來(lái)操作注冊(cè)表,來(lái)禁用鍵盤(pán)這么麻煩的方法呢?原因很簡(jiǎn)單,突然對(duì)編程語(yǔ)言操作注冊(cè)表很感興趣,就這么做了。
簡(jiǎn)單介紹注冊(cè)表
注冊(cè)表結(jié)構(gòu)類似文件目錄:分為根鍵、子鍵和鍵值項(xiàng)三部分,與文件目錄對(duì)應(yīng)的話就是根目錄、子目錄和文件。簡(jiǎn)單介紹一下這三部分:
(1)根鍵
分為5個(gè):HKEY_CLASSES_ROOT, HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_USERS和HKEY_CURRENT_CONFIG
(2)子鍵
可以有多個(gè)子鍵和鍵值項(xiàng),就像一個(gè)目錄中可以有多個(gè)子目錄和多個(gè)文件一樣。
(3)鍵值項(xiàng)
**可以理解為文件,它由三部分組成,分別為 :名稱、類型、數(shù)據(jù)。其中類型主要有:
REG_BINARY 二進(jìn)制數(shù)據(jù)
REG_DWORD 32位雙字節(jié)數(shù)據(jù)
REG_SZ 以0結(jié)尾的字符串
REG_DWORD_BIG_ENDIAN 高位排在底位的雙字
REG_EXPAND_SZ 擴(kuò)展字符串,可以加入變量如%PATH%
REG_LINK UNICODE 符號(hào)鏈接
REG_RESOURCE_LIST 設(shè)備驅(qū)動(dòng)程序資源列表
REG_MULTI_SZ 多字符串
注冊(cè)表數(shù)據(jù)項(xiàng)的數(shù)據(jù)類型有8種,最常用的是前3種。
操作注冊(cè)表的幾個(gè)API函數(shù)
需要頭文件:atlbase.h
(1)打開(kāi)一個(gè)鍵
(2)查詢某一個(gè)鍵值
(3)設(shè)置一個(gè)鍵值
(4)新建指定鍵
(5)刪除注冊(cè)表指定鍵下的值
刪除注冊(cè)表項(xiàng)
RegDeleteKey 也可用來(lái)刪除一個(gè)鍵值。在 Win 95/98 平臺(tái)下,也可用來(lái)刪除整個(gè)子鍵和鍵值。但是在Windows NT/2000平臺(tái)下,只能用來(lái)刪除沒(méi)有子鍵的鍵。
使用說(shuō)明
工具需要以管理員方式啟動(dòng)
特別聲明
+由于修改注冊(cè)表后,需要重啟電腦后才能生效。所以代碼中加入了詢問(wèn)“是否立刻重啟”的語(yǔ)句
源碼說(shuō)明
#include <iostream>
#include <atlbase.h>
#include <Windows.h>
using namespace std;
void write_dword();
//測(cè)試成功,讀取到start的當(dāng)前值//讀取操作表,其類型為DWORD
void read_dword(){
HKEY hKEY;//定義有關(guān)的鍵,在查詢結(jié)束時(shí)關(guān)閉
//打開(kāi)與路徑data_Set相關(guān)的hKEY
char i,x;
LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
//訪問(wèn)注冊(cè)表,hKEY則保存此函數(shù)所打開(kāi)的鍵的句柄
if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_READ, &hKEY)){
DWORD dwValue;//長(zhǎng)整型數(shù)據(jù),如果是字符串?dāng)?shù)據(jù)用char數(shù)組
DWORD dwSize = sizeof(DWORD);
DWORD dwType = REG_DWORD;
if (::RegQueryValueEx(hKEY, _T("Start"), 0, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
cout << "錯(cuò)誤:無(wú)法查詢有關(guān)的注冊(cè)表信息" << endl;
switch (dwValue){
case 3:
cout << "當(dāng)前筆記本鍵盤(pán)狀態(tài)為:?jiǎn)⒂?" << "(" << hex << dwValue << ")" << endl << endl << "若需要禁用請(qǐng)輸入字母:y或Y" << endl;
cin >> i;
if (i == 'y'|| i == 'Y') {
write_dword();
}
break;
case 4:
cout << "當(dāng)前筆記本鍵盤(pán)狀態(tài)為:禁用 " << "(" << hex << dwValue << ")" << endl << endl << "若需要啟用請(qǐng)輸入字母:y或Y" << endl;
cin >> x;
if (x == 'y' || x == 'Y') {
write_dword();
}
break;
default:
cout << "當(dāng)前筆記本鍵盤(pán)狀態(tài)獲取未知 " << "(" << hex << dwValue << ")" << endl << endl;
break;
}
}
::RegCloseKey(hKEY);
}
//測(cè)試成功,讀取到start設(shè)備名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 << "無(wú)法查詢有關(guān)的注冊(cè)表信息" << endl << endl;
}
cout << "當(dāng)前設(shè)備名:" << dwValue << endl << endl;
}
::RegCloseKey(hkey);
}
//測(cè)試成功,更改(創(chuàng)建)到start鍵值//在SYSTEM\CurrentControlSet\Services\i8042prt文件夾下讀取Start的子鍵,設(shè)置其值為dwValue
void write_dword(){
HKEY hkey;//定義有關(guān)的hkey,在查詢結(jié)束時(shí)要關(guān)閉
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 << "請(qǐng)?jiān)O(shè)置當(dāng)前筆記本鍵盤(pán)狀態(tài),輸入數(shù)字:3,表示開(kāi)啟鍵盤(pán);輸入數(shù)字4,表示禁用鍵盤(pán);" << endl;
cin >> flag;
switch (flag) {
case 3:
dwValue = flag; break;
case 4:
dwValue = flag; break;
default:
cout << "狀態(tài)值輸入錯(cuò)誤" << endl; break;
}
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
//if (ERROR_SUCCESS == ::RegCreateKey(hkey, _T("解開(kāi)該段落注釋,則可更改為:在SYSTEM\\CurrentControlSet\\Services\\i8042prt下,創(chuàng)建以'該文本內(nèi)容'為名稱的子健,并創(chuàng)建一個(gè)名為“Start”的子健,其值為:dwValue"), &hTempKey)){
if (ERROR_SUCCESS != ::RegSetValueEx(hkey, _T("Start"), 0, REG_DWORD, (CONST BYTE*) & dwValue, sizeof(DWORD))){
cout << "寫(xiě)入注冊(cè)表失敗" << endl;
}
cout << "修改成功!" << endl << "是否立刻重啟電腦,使設(shè)置立即生效?" << endl << "輸入y或Y,以立刻重新啟動(dòng)電腦;輸入n或N退出程序" << endl;
cin >> ans;
if (ans == 'y' || ans == 'Y') {
cout << "再次確認(rèn),要立刻重啟電腦嗎?\n\n輸入y或Y,以立刻重新啟動(dòng)電腦;輸入n或N退出程序" << endl;
cin >> ans;
if (ans == 'y' || ans == 'Y')
system("shutdown -r -t 0");
}
else
exit(1);
//}
}
::RegCloseKey(hkey);
}
//測(cè)試成功,更改(創(chuàng)建)子鍵test111及其鍵值項(xiàng)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 << "寫(xiě)入錯(cuò)誤" << endl;
}
}
}
::RegCloseKey(hkey);
}
//測(cè)試成功,更改(創(chuàng)建)子鍵test111及其鍵值項(xiàng)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 << "寫(xiě)入錯(cuò)誤" << endl;
}
}
}
::RegCloseKey(hkey);
}
//測(cè)試成功,將鍵值項(xiàng)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 << "刪除錯(cuò)誤" << endl;
}
}
::RegCloseKey(hkey);
}
//測(cè)試成功,將子鍵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 << "刪除錯(cuò)誤" << endl;
}
}
::RegCloseKey(hkey);
}
void menu(){
cout << "歡迎使用本工具" << endl << endl;
read_reg_sz();
cout << endl << "已為您查詢到該筆記本當(dāng)前鍵盤(pán)狀態(tài)為:" ;
read_dword();
}
int main(){
menu();
system("pause");
return 0;
}