分享

注册表编程

 JP_Morgen 2014-05-18

接着昨天的折腾。

首先介绍一下 扩展名子键 和 类定义子键

扩展名子键由 "." + 相应扩展名构成 ,该子键的键值项的作用是指向一个“类定义子键”,起入口作用。 多个扩展名子键可以指向同一个类定义子键。

这样做其实就是面向对象的思维了。

举个例子来说,扩展名子键是.MP1    .MP2     .MP3

他们都指向类定义子键MP3FILE,那么只要定义MP3FILE里面的键值就可以对所有的扩展名子键应用了。

 

知道了这个概念以后我们可以实现用第二种方法更改关联了:

通过 修改扩展名子键对应的类定义子键来修改关联

举个例子,原来.exe 默认的键值是 EXEFILE 说明它关联的是EXEFILE, 如果我们将它改成TXTFILE, 自然就修改了它的关联方式。

 

然后说一下今天在修改txt关联的时候遇到的一个问题:

本来是已经成功地更改了txt关联了,但是在恢复的时候可能把键值的路径写错了,没有用\\来转义\,这个时候我打开任意一个txt文件,系统让我选择默认的打开方式。我一不小心选择了 始终用这种方式打开 接下来就出问题了。

不管我怎么修改关联,txt文件仍然能正常打开。

于是心里猜测:在注册表里面肯定存在着优先于上述路径关联文件的打开方式,由于默认打开的关联优先于上述路径的关联,所以上述路径下(见我的上一篇文章)设置的关联不起作用了。

自己的电脑是32的win7.在控制面板里面可以看到默认打开方式的设置:

控制面板\程序\默认程序\设置关联

修改这里可以修改关联,但是自己推测这里在修改的时候肯定是修改了注册表某项的关联。自己百度了一下暂时没有查到这个路径的资料。明天再看看。。。。

自己本来还想修改文件夹图标所在的注册表键值,百度了一下还是没有找到。。明天继续看一看。。。。。。。

最后把自己写的半成品发个上来,记录一下。

用的是SDK的对话框模版,所以只发主要代码:

  1. // MachineDialog.cpp : 定义应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include "MachineDialog.h"  
  6. #include "resource.h"  
  7. #include <commdlg.h>  
  8. #include <windowsx.h>  
  9. //增加开机自启动项  
  10. int Add_Key(HWND hDlg, LPCTSTR filename);  
  11. // 删除开机自启动项  没有完成  
  12. int Del_Key(HWND hDlg);  
  13. //更改IE默认主页  
  14. int Change_IE_Mainpage(HWND hDlg);  
  15. //更改exe关联   
  16. int Change_Exe_Rela(HWND hDlg);  
  17. //恢复exe关联   
  18. int Change_Exe_Reco(HWND hDlg);  
  19. //更改txt关联   
  20. int Change_Txt_Rela(HWND hDlg);  
  21. //恢复txt关联   
  22. int Change_Txt_Reco(HWND hDlg);  
  23. //禁用注册表  
  24. int Reg_Forbidden(HWND hDlg);  
  25. //恢复注册表  
  26. int Reg_Reco(HWND hDlg);  
  27.   
  28. BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);  
  29.   
  30. int APIENTRY _tWinMain(HINSTANCE hInstance,  
  31.                      HINSTANCE hPrevInstance,  
  32.                      LPTSTR    lpCmdLine,  
  33.                      int       nCmdShow)  
  34. {  
  35.     DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc );  
  36.     return 0;  
  37. }  
  38.   
  39. BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)  
  40. {  
  41.       
  42.       
  43.   
  44.     switch (message)    
  45.     {    
  46.     case WM_INITDIALOG:    
  47.         return TRUE;    
  48.   
  49.     case WM_COMMAND:    
  50.         switch (LOWORD(wParam))      
  51.         {  
  52.             case IDC_ADD_SECTION:  
  53.                 // 设置过滤器  
  54.                 OPENFILENAME ofn;  
  55.                 char szFile[100];  
  56.                 TCHAR szLength[50];  
  57.                 ZeroMemory(&ofn,sizeof(ofn));   //memset给结构体清零  
  58.                 ofn.lStructSize = sizeof(ofn);  
  59.                 ofn.lpstrFile = (LPWSTR)szFile;  
  60.                 ofn.lpstrFile[0] = TEXT('\0');  
  61.                 ofn.nMaxFile = sizeof(szFile);  
  62.                 ofn.lpstrFilter = TEXT("ALL\0*.*\0exe\0*.exe\0txt\0*.txt\0");           //过滤器设置  
  63.                 ofn.nFilterIndex = 1;                                       //默认选择过滤器的序号  
  64.                 ofn.lpstrFileTitle = NULL;  
  65.                 ofn.nMaxFileTitle = 0;  
  66.                 ofn.lpstrInitialDir = NULL;  
  67.                 ofn.hwndOwner = hDlg;                                       //对话框的副窗口  
  68.                 ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST ;  
  69.                 if (GetOpenFileName(&ofn))  
  70.                 {  
  71.                     TCHAR shortPath[100];  
  72.                     memset(shortPath, 0, sizeof(shortPath));  
  73.                     GetShortPathName((LPWSTR)szFile, (LPWSTR)shortPath, sizeof(shortPath));  
  74.                     SetDlgItemText(hDlg, IDC_EDIT1, (LPWSTR)shortPath);  
  75.                     Add_Key(hDlg, (LPCTSTR)shortPath);  
  76.                 }  
  77.                 return 0;  
  78.                   
  79.   
  80.             case IDC_DEL_SECTION:  
  81.                 //Del_Key(hDlg);  
  82.                 return 0;  
  83.                   
  84.             case IDC_IE:  
  85.                 Change_IE_Mainpage(hDlg);  
  86.                 return 0;  
  87.   
  88.             case IDC_EXE_RELA:  
  89.                 Change_Exe_Rela(hDlg);  
  90.                 return 0;  
  91.   
  92.             case IDC_EXE_RECO:  
  93.                 Change_Exe_Reco(hDlg);  
  94.                 return 0;  
  95.   
  96.             case IDC_TXT_RELA:  
  97.                 Change_Txt_Rela(hDlg);  
  98.                 return 0;  
  99.   
  100.             case IDC_TXT_RECO:  
  101.                 Change_Txt_Reco(hDlg);  
  102.                 return 0;  
  103.   
  104.             case IDC_REG_FORBIDDEN:  
  105.                 Reg_Forbidden(hDlg);  
  106.                 return 0;  
  107.   
  108.             case IDC_REG_RECO:  
  109.                 Reg_Reco(hDlg);  
  110.                 return 0;  
  111.   
  112.             case IDC_EXIT:  
  113.                 EndDialog(hDlg, NULL);  
  114.   
  115.             default:  
  116.                 return 0;  
  117.         }  
  118.     }    
  119.     return FALSE;    
  120. }  
  121.   
  122. int Add_Key(HWND hDlg, LPCTSTR filename)  
  123. {  
  124.     HKEY hKey;  
  125.     LPCTSTR lpRun =  L"software\\Microsoft\\Windows\\CurrentVersion\\Run";  
  126.     //打开注册表  
  127.     long result=RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);   
  128.     if(result==ERROR_SUCCESS)  
  129.     {  
  130.         MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);  
  131.         //添加注册表键值    
  132.         result=RegSetValueEx(hKey, L"greedy snake", 0, REG_SZ, (BYTE *)filename, 100);  
  133.         if (result == ERROR_SUCCESS)  
  134.         {  
  135.             MessageBox(hDlg, TEXT("成功添加注册表键值"), TEXT("成功"), MB_OK);  
  136.         }  
  137.         else  
  138.         {  
  139.             MessageBox(hDlg, TEXT("添加注册表键值失败"), TEXT("失败"), MB_OK);  
  140.             //printf("%d\n", result);  
  141.         }  
  142.     }  
  143.     else  
  144.     {  
  145.         MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);  
  146.     }  
  147.     RegCloseKey(hKey);  
  148.     return 0;  
  149. }  
  150.   
  151. int Change_IE_Mainpage(HWND hDlg)  
  152. {  
  153.     HKEY hKey;  
  154.     TCHAR mainpage[100];  
  155.     LPCTSTR lpRun =  L"S-1-5-21-455092624-2783291490-1266880768-1000\\Software\\Microsoft\\Internet Explorer\\Main";  
  156.     GetDlgItemText(hDlg, IDC_EDIT2, mainpage, 100);  
  157.     //打开注册表  
  158.     long result=RegOpenKeyEx(HKEY_USERS, lpRun, 0, KEY_WRITE, &hKey);   
  159.     if(result==ERROR_SUCCESS)  
  160.     {  
  161.         MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);  
  162.         //添加注册表键值    
  163.         result=RegSetValueEx(hKey, L"Start Page", 0, REG_SZ, (BYTE *)mainpage, 100);  
  164.         if (result == ERROR_SUCCESS)  
  165.         {  
  166.             MessageBox(hDlg, TEXT("更改IE默认主页成功"), TEXT("成功"), MB_OK);  
  167.         }  
  168.         else  
  169.         {  
  170.             MessageBox(hDlg, TEXT("更改IE默认主页失败"), TEXT("失败"), MB_OK);  
  171.             //printf("%d\n", result);  
  172.         }  
  173.     }  
  174.     else  
  175.     {  
  176.         MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);  
  177.     }  
  178.     RegCloseKey(hKey);  
  179.     return 0;  
  180. }  
  181.   
  182.   
  183. int Change_Exe_Rela(HWND hDlg)  
  184. {  
  185.     HKEY hKey;  
  186.     TCHAR mainpage[100] = L"F:\\成品小软件\\贪吃蛇.exe";  
  187.     LPCTSTR lpRun =  L"exefile\\shell\\open\\command";  
  188.     //GetDlgItemText(hDlg, IDC_EDIT2, mainpage, 100);  
  189.     //打开注册表  
  190.     long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey);   
  191.     if(result==ERROR_SUCCESS)  
  192.     {  
  193.         MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);  
  194.         //添加注册表键值    
  195.         result=RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)mainpage, 100);  
  196.         if (result == ERROR_SUCCESS)  
  197.         {  
  198.             MessageBox(hDlg, TEXT("更改exe关联成功"), TEXT("成功"), MB_OK);  
  199.         }  
  200.         else  
  201.         {  
  202.             MessageBox(hDlg, TEXT("更改exe关联失败"), TEXT("失败"), MB_OK);  
  203.             //printf("%d\n", result);  
  204.         }  
  205.     }  
  206.     else  
  207.     {  
  208.         MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);  
  209.     }  
  210.     RegCloseKey(hKey);  
  211.     return 0;  
  212. }  
  213.   
  214. int Change_Exe_Reco(HWND hDlg)  
  215. {  
  216.     HKEY hKey;  
  217.     TCHAR mainpage[100] = L"\"%1\" %*";  
  218.     LPCTSTR lpRun =  L"exefile\\shell\\open\\command";  
  219.     //打开注册表  
  220.     long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey);   
  221.     if(result==ERROR_SUCCESS)  
  222.     {  
  223.         MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);  
  224.         //添加注册表键值    
  225.         result=RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)mainpage, 100);  
  226.         if (result == ERROR_SUCCESS)  
  227.         {  
  228.             MessageBox(hDlg, TEXT("恢复exe关联成功"), TEXT("成功"), MB_OK);  
  229.         }  
  230.         else  
  231.         {  
  232.             MessageBox(hDlg, TEXT("恢复exe关联失败"), TEXT("失败"), MB_OK);  
  233.             //printf("%d\n", result);  
  234.         }  
  235.     }  
  236.     else  
  237.     {  
  238.         MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);  
  239.     }  
  240.     RegCloseKey(hKey);  
  241.     return 0;  
  242. }  
  243.   
  244. int Change_Txt_Rela(HWND hDlg)  
  245. {  
  246.     HKEY hKey;  
  247.     TCHAR mainpage[100] = L"C:\\Windows\\System32\\cmd.exe";  
  248.     LPCTSTR lpRun =  L"txtfile\\shell\\open\\command";  
  249.     //打开注册表  
  250.     long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey);   
  251.     if(result==ERROR_SUCCESS)  
  252.     {  
  253.         MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);  
  254.         //添加注册表键值    
  255.         result=RegSetValueEx(hKey, NULL, 0, REG_EXPAND_SZ, (BYTE *)mainpage, 100);  
  256.         if (result == ERROR_SUCCESS)  
  257.         {  
  258.             MessageBox(hDlg, TEXT("修改txt关联成功"), TEXT("成功"), MB_OK);  
  259.         }  
  260.         else  
  261.         {  
  262.             MessageBox(hDlg, TEXT("修改txt关联失败"), TEXT("失败"), MB_OK);  
  263.             //printf("%d\n", result);  
  264.         }  
  265.     }  
  266.     else  
  267.     {  
  268.         MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);  
  269.     }  
  270.     RegCloseKey(hKey);  
  271.     return 0;  
  272. }  
  273.   
  274. int Change_Txt_Reco(HWND hDlg)  
  275. {  
  276.     HKEY hKey;  
  277.     TCHAR mainpage[100] = L"%SystemRoot%\\system32\\NOTEPAD.EXE %1";  
  278.     LPCTSTR lpRun =  L"txtfile\\shell\\open\\command";  
  279.     //打开注册表  
  280.     long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey);   
  281.     if(result==ERROR_SUCCESS)  
  282.     {  
  283.         MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);  
  284.         //添加注册表键值    
  285.         result=RegSetValueEx(hKey, NULL, 0, REG_EXPAND_SZ, (BYTE *)mainpage, 100);  
  286.         if (result == ERROR_SUCCESS)  
  287.         {  
  288.             MessageBox(hDlg, TEXT("恢复txt关联成功"), TEXT("成功"), MB_OK);  
  289.         }  
  290.         else  
  291.         {  
  292.             MessageBox(hDlg, TEXT("恢复txt关联失败"), TEXT("失败"), MB_OK);  
  293.         }  
  294.     }  
  295.     else  
  296.     {  
  297.         MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);  
  298.     }  
  299.     RegCloseKey(hKey);  
  300.     return 0;  
  301. }  
  302.   
  303. int Reg_Forbidden(HWND hDlg)  
  304. {  
  305.     HKEY hKey;  
  306.     DWORD DisReg = 0x00000001;  
  307.     LPCTSTR lpRun =  L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";  
  308.     //打开注册表  
  309.     long result=RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);   
  310.     if(result==ERROR_SUCCESS)  
  311.     {  
  312.         MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);  
  313.         //添加注册表键值    
  314.         result=RegSetValueEx(hKey, L"DisableRegistryTools", 0, REG_DWORD,  (const BYTE *)&DisReg, sizeof(DisReg));  
  315.         if (result == ERROR_SUCCESS)  
  316.         {  
  317.             MessageBox(hDlg, TEXT("禁用注册表成功"), TEXT("成功"), MB_OK);  
  318.         }  
  319.         else  
  320.         {  
  321.             MessageBox(hDlg, TEXT("禁用注册表失败"), TEXT("失败"), MB_OK);  
  322.         }  
  323.     }  
  324.     else  
  325.     {  
  326.         MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);  
  327.     }  
  328.     RegCloseKey(hKey);  
  329.     return 0;  
  330. }  
  331.   
  332. int Reg_Reco(HWND hDlg)  
  333. {  
  334.     HKEY hKey;  
  335.     DWORD DisReg = 0x00000000;  
  336.     LPCTSTR lpRun =  L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";  
  337.     //打开注册表  
  338.     long result=RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey);   
  339.     if(result==ERROR_SUCCESS)  
  340.     {  
  341.         MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);  
  342.         //添加注册表键值    
  343.         result=RegSetValueEx(hKey, L"DisableRegistryTools", 0, REG_DWORD,  (const BYTE *)&DisReg, sizeof(DisReg));  
  344.         if (result == ERROR_SUCCESS)  
  345.         {  
  346.             MessageBox(hDlg, TEXT("恢复禁用注册表成功"), TEXT("成功"), MB_OK);  
  347.         }  
  348.         else  
  349.         {  
  350.             MessageBox(hDlg, TEXT("恢复禁用注册表失败"), TEXT("失败"), MB_OK);  
  351.         }  
  352.     }  
  353.     else  
  354.     {  
  355.         MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);  
  356.     }  
  357.     RegCloseKey(hKey);  
  358.     return 0;  
  359. }  



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多