前言

之所以寫這個程式,是因為宿舍桌子太小。有時把外接鍵盤疊在筆記本鍵盤上,容易誤觸到筆記本鍵盤:



從而導致一些莫名其妙的問題困擾自己。

於是找了些資料瞭解到瞭如何禁用筆記本鍵盤的方法:

  1. + 禁用裝置法。詳細教程請點選**[`這裡`](https://jingyan.baidu.com/article/77b8dc7fb9aa336175eab674.html)**
  2. + 修改登錄檔法。詳細教程請點選**[`這裡`](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)開啟一個鍵

  1. RegOpenKeyEx
  2. 函式定義:LONG RegOpenKeyEx(HKEY hKey,//已經開啟的鍵的控制代碼,或者直接是上述幾個根鍵
  3. LPCTSTR lpSubKey,//要開啟的子鍵名字的地址
  4. DWORD ulOptions,//保留值,必須為0
  5. REGSAM samDesired,//開啟方式,如讀還是寫
  6. PHKEY phkResult//返回的開啟的子鍵的控制代碼
  7. );

(2)查詢某一個鍵值

  1. RegQueryValueEx
  2. 函式定義:LONG RegQueryValueEx(HKEY hKey,//要查詢的鍵的控制代碼
  3. LPCTSTR lpValueName,//要查詢的鍵值的名稱
  4. LPDWORD lpReserved,//保留值
  5. LPDWORD lpType,//要查詢的資料的型別
  6. LPBYTE lpData,//要返回的查詢的資料
  7. LPDWORD lpcbData//預置的資料的長度
  8. );

(3)設定一個鍵值

  1. RegSetValueEx
  2. 函式定義:LONG RegSetValueEx(HKEY hKey,//要設定的鍵的控制代碼
  3. LPCTSTR lpValueName,//要訪問的鍵值的名稱
  4. LPDWORD lpReserved,//保留值
  5. DWORD dwType,//要設定的資料的型別
  6. const BYTE *lpData,//要設定的健值
  7. DWORD cbData//資料的長度
  8. );

(4)新建指定鍵

  1. RegCreateKey
  2. 函式定義:LONG RegCreateKey (HKEY hkey, // 要開啟鍵的控制代碼
  3. LPCTSTR lpsubkey, // 要開啟子鍵的名字的地址
  4. PHKEY phkresult // 已開啟控制代碼的快取區的地址
  5. );

(5)刪除登錄檔指定鍵下的值

  1. LONG RegDeleteValue(HKEY hKey, //子鍵的控制代碼
  2. LPCTSTR lpValueName //刪除鍵值的名稱
  3. );

(5.2)刪除登錄檔項

  1. LONG RegDeleteKey(HKEY hKey, //已開啟的鍵的控制代碼
  2. LPCTSTR lpSubKey //要刪除的子鍵或路徑
  3. );

RegDeleteKey 也可用來刪除一個鍵值。在 Win 95/98 平臺下,也可用來刪除整個子鍵和鍵值。但是在Windows NT/2000平臺下,只能用來刪除沒有子鍵的鍵。

特別宣告

+由於修改登錄檔後,需要重啟電腦後才能生效。所以程式碼中加入了詢問“是否立刻重啟”的語句

+程式碼中的部分函式沒有必要,僅僅是我練習其他登錄檔操作功能所寫,與程式碼本身目的毫無關聯

無關聯函式如下
read_reg_sz();
write_binary()
write_reg_sz()
delete_value()
delete_key()

**

+之所以附上無關聯函式,一方面為了以後有機會的話自己再次複習,另一方面是給讀者一些啟發。我覺得初學者更能懂初學者哈哈,也許其他函式也能夠被有興趣的讀者拿來開發出更有價值的內容(工具)。

**

成品

執行截圖



下載

藍奏雲 訪問碼:ocean

原始碼

  1. #include <iostream>
  2. #include <atlbase.h>
  3. #include <Windows.h>
  4. using namespace std;
  5. void write_dword();
  6. //測試成功,讀取到start的當前值//讀取操作表,其型別為DWORD
  7. void read_dword(){
  8. HKEY hKEY;//定義有關的鍵,在查詢結束時關閉
  9. //開啟與路徑data_Set相關的hKEY
  10. char i,x;
  11. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  12. //訪問登錄檔,hKEY則儲存此函式所開啟的鍵的控制代碼
  13. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_READ, &hKEY)){
  14. DWORD dwValue;//長整型資料,如果是字串資料用char陣列
  15. DWORD dwSize = sizeof(DWORD);
  16. DWORD dwType = REG_DWORD;
  17. if (::RegQueryValueEx(hKEY, _T("Start"), 0, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
  18. cout << "錯誤:無法查詢有關的登錄檔資訊" << endl;
  19. switch (dwValue){
  20. case 3:
  21. cout << "當前筆記本鍵盤狀態為:啟用 " << "(" << hex << dwValue << ")" << endl << endl << "若需要禁用請輸入字母:y或Y" << endl;
  22. cin >> i;
  23. if (i == 'y'|| i == 'Y') {
  24. write_dword();
  25. }
  26. break;
  27. case 4:
  28. cout << "當前筆記本鍵盤狀態為:禁用 " << "(" << hex << dwValue << ")" << endl << endl << "若需要啟用請輸入字母:y或Y" << endl;
  29. cin >> x;
  30. if (x == 'y' || x == 'Y') {
  31. write_dword();
  32. }
  33. break;
  34. default:
  35. cout << "當前筆記本鍵盤狀態獲取未知 " << "(" << hex << dwValue << ")" << endl << endl;
  36. break;
  37. }
  38. }
  39. ::RegCloseKey(hKEY);
  40. }
  41. //測試成功,讀取到start裝置名displayname//讀取操作表,其型別為REG_SZ
  42. void read_reg_sz(){
  43. HKEY hkey;
  44. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  45. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_READ, &hkey)){
  46. char dwValue[256];
  47. DWORD dwSzType = REG_SZ;
  48. DWORD dwSize = sizeof(dwValue);
  49. if (::RegQueryValueEx(hkey, _T("DisplayName"), 0, &dwSzType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS){
  50. cout << "無法查詢有關的登錄檔資訊" << endl << endl;
  51. }
  52. cout << "當前裝置名:" << dwValue << endl << endl;
  53. }
  54. ::RegCloseKey(hkey);
  55. }
  56. //測試成功,更改(建立)到start鍵值//在SYSTEM\CurrentControlSet\Services\i8042prt資料夾下讀取Start的子鍵,設定其值為dwValue
  57. void write_dword(){
  58. HKEY hkey;//定義有關的hkey,在查詢結束時要關閉
  59. HKEY hTempKey;
  60. char ans;
  61. int flag;
  62. DWORD dwValue;
  63. DWORD dwSize = sizeof(DWORD);
  64. DWORD dwType = REG_DWORD;
  65. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  66. cout << "請設定當前筆記本鍵盤狀態,輸入數字:3,表示開啟鍵盤;輸入數字4,表示禁用鍵盤;" << endl;
  67. cin >> flag;
  68. switch (flag) {
  69. case 3:
  70. dwValue = flag; break;
  71. case 4:
  72. dwValue = flag; break;
  73. default:
  74. cout << "狀態值輸入錯誤" << endl; break;
  75. }
  76. if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
  77. //if (ERROR_SUCCESS == ::RegCreateKey(hkey, _T("解開該段落註釋,則可更改為:在SYSTEM\\CurrentControlSet\\Services\\i8042prt下,建立以'該文字內容'為名稱的子健,並建立一個名為“Start”的子健,其值為:dwValue"), &hTempKey)){
  78. if (ERROR_SUCCESS != ::RegSetValueEx(hkey, _T("Start"), 0, REG_DWORD, (CONST BYTE*) & dwValue, sizeof(DWORD))){
  79. cout << "寫入登錄檔失敗" << endl;
  80. }
  81. cout << "修改成功!" << endl << "是否立刻重啟電腦,使設定立即生效?" << endl << "輸入y或Y,以立刻重新啟動電腦;輸入n或N退出程式" << endl;
  82. cin >> ans;
  83. if (ans == 'y' || ans == 'Y') {
  84. cout << "再次確認,要立刻重啟電腦嗎?\n\n輸入y或Y,以立刻重新啟動電腦;輸入n或N退出程式" << endl;
  85. cin >> ans;
  86. if (ans == 'y' || ans == 'Y')
  87. system("shutdown -r -t 0");
  88. }
  89. else
  90. exit(1);
  91. //}
  92. }
  93. ::RegCloseKey(hkey);
  94. }
  95. //測試成功,更改(建立)子鍵test111及其鍵值項Name到start鍵值
  96. void write_binary(){
  97. HKEY hkey;
  98. HKEY hTempKey;
  99. BYTE m_name[10];
  100. memset(m_name, 0, sizeof(m_name));
  101. m_name[0] = 0xff;
  102. m_name[1] = 0xac;
  103. m_name[2] = 0x05;
  104. m_name[3] = 0x4e;
  105. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  106. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
  107. if (ERROR_SUCCESS == ::RegCreateKey(hkey, _T("test111"), &hTempKey)){
  108. if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_BINARY, (unsigned char*)m_name, 5)){
  109. cout << "寫入錯誤" << endl;
  110. }
  111. }
  112. }
  113. ::RegCloseKey(hkey);
  114. }
  115. //測試成功,更改(建立)子鍵test111及其鍵值項Name到start鍵值
  116. void write_reg_sz(){
  117. HKEY hkey;
  118. HKEY hTempKey;
  119. char m_name_set[256] = "China";
  120. DWORD len = strlen(m_name_set) + 1;
  121. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  122. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
  123. if (ERROR_SUCCESS == ::RegCreateKey(hkey, _T("test111"), &hTempKey)){
  124. if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_SZ, (const BYTE*)m_name_set, len)){
  125. cout << "寫入錯誤" << endl;
  126. }
  127. }
  128. }
  129. ::RegCloseKey(hkey);
  130. }
  131. //測試成功,將鍵值項Name刪除
  132. void delete_value()
  133. {
  134. HKEY hkey;
  135. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt\\test111");
  136. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey))
  137. {
  138. if (ERROR_SUCCESS != ::RegDeleteValue(hkey, _T("Name")))
  139. {
  140. cout << "刪除錯誤" << endl;
  141. }
  142. }
  143. ::RegCloseKey(hkey);
  144. }
  145. //測試成功,將子鍵test111刪除
  146. void delete_key(){
  147. HKEY hkey;
  148. LPCTSTR data_set = _T("SYSTEM\\CurrentControlSet\\Services\\i8042prt");
  149. if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_set, 0, KEY_SET_VALUE, &hkey)){
  150. if (ERROR_SUCCESS != ::RegDeleteKey(hkey, "test111")){
  151. cout << "刪除錯誤" << endl;
  152. }
  153. }
  154. ::RegCloseKey(hkey);
  155. }
  156. void menu(){
  157. cout << "歡迎使用本工具" << endl << endl;
  158. read_reg_sz();
  159. cout << endl << "已為您查詢到該筆記本當前鍵盤狀態為:" ;
  160. read_dword();
  161. }
  162. int main(){
  163. menu();
  164. system("pause");
  165. return 0;
  166. }

尾聲

**

由於本人剛接觸登錄檔操作的相關知識,有大佬能夠指點最好不過。

**