注册表编程
来源:互联网 发布:公众号平台源码 编辑:程序博客网 时间:2024/05/29 10:08
接着昨天的折腾。
首先介绍一下 扩展名子键 和 类定义子键
扩展名子键由 "." + 相应扩展名构成 ,该子键的键值项的作用是指向一个“类定义子键”,起入口作用。 多个扩展名子键可以指向同一个类定义子键。
这样做其实就是面向对象的思维了。
举个例子来说,扩展名子键是.MP1 .MP2 .MP3
他们都指向类定义子键MP3FILE,那么只要定义MP3FILE里面的键值就可以对所有的扩展名子键应用了。
知道了这个概念以后我们可以实现用第二种方法更改关联了:
通过 修改扩展名子键对应的类定义子键来修改关联
举个例子,原来.exe 默认的键值是 EXEFILE 说明它关联的是EXEFILE, 如果我们将它改成TXTFILE, 自然就修改了它的关联方式。
然后说一下今天在修改txt关联的时候遇到的一个问题:
本来是已经成功地更改了txt关联了,但是在恢复的时候可能把键值的路径写错了,没有用\\来转义\,这个时候我打开任意一个txt文件,系统让我选择默认的打开方式。我一不小心选择了始终用这种方式打开 接下来就出问题了。
不管我怎么修改关联,txt文件仍然能正常打开。
于是心里猜测:在注册表里面肯定存在着优先于上述路径关联文件的打开方式,由于默认打开的关联优先于上述路径的关联,所以上述路径下(见我的上一篇文章)设置的关联不起作用了。
自己的电脑是32的win7.在控制面板里面可以看到默认打开方式的设置:
控制面板\程序\默认程序\设置关联
修改这里可以修改关联,但是自己推测这里在修改的时候肯定是修改了注册表某项的关联。自己百度了一下暂时没有查到这个路径的资料。明天再看看。。。。
自己本来还想修改文件夹图标所在的注册表键值,百度了一下还是没有找到。。明天继续看一看。。。。。。。
最后把自己写的半成品发个上来,记录一下。
用的是SDK的对话框模版,所以只发主要代码:
// MachineDialog.cpp : 定义应用程序的入口点。//#include "stdafx.h"#include "MachineDialog.h"#include "resource.h"#include <commdlg.h>#include <windowsx.h>//增加开机自启动项int Add_Key(HWND hDlg, LPCTSTR filename);// 删除开机自启动项 没有完成int Del_Key(HWND hDlg);//更改IE默认主页int Change_IE_Mainpage(HWND hDlg);//更改exe关联 int Change_Exe_Rela(HWND hDlg);//恢复exe关联 int Change_Exe_Reco(HWND hDlg);//更改txt关联 int Change_Txt_Rela(HWND hDlg);//恢复txt关联 int Change_Txt_Reco(HWND hDlg);//禁用注册表int Reg_Forbidden(HWND hDlg);//恢复注册表int Reg_Reco(HWND hDlg);BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN), NULL, DlgProc );return 0;}BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) {case IDC_ADD_SECTION:// 设置过滤器OPENFILENAME ofn;char szFile[100];TCHAR szLength[50];ZeroMemory(&ofn,sizeof(ofn));//memset给结构体清零ofn.lStructSize = sizeof(ofn);ofn.lpstrFile = (LPWSTR)szFile;ofn.lpstrFile[0] = TEXT('\0');ofn.nMaxFile = sizeof(szFile);ofn.lpstrFilter = TEXT("ALL\0*.*\0exe\0*.exe\0txt\0*.txt\0"); //过滤器设置ofn.nFilterIndex = 1;//默认选择过滤器的序号ofn.lpstrFileTitle = NULL;ofn.nMaxFileTitle = 0;ofn.lpstrInitialDir = NULL;ofn.hwndOwner = hDlg; //对话框的副窗口ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST ;if (GetOpenFileName(&ofn)){TCHAR shortPath[100];memset(shortPath, 0, sizeof(shortPath));GetShortPathName((LPWSTR)szFile, (LPWSTR)shortPath, sizeof(shortPath));SetDlgItemText(hDlg, IDC_EDIT1, (LPWSTR)shortPath);Add_Key(hDlg, (LPCTSTR)shortPath);}return 0;case IDC_DEL_SECTION://Del_Key(hDlg);return 0;case IDC_IE:Change_IE_Mainpage(hDlg);return 0;case IDC_EXE_RELA:Change_Exe_Rela(hDlg);return 0;case IDC_EXE_RECO:Change_Exe_Reco(hDlg);return 0;case IDC_TXT_RELA:Change_Txt_Rela(hDlg);return 0;case IDC_TXT_RECO:Change_Txt_Reco(hDlg);return 0;case IDC_REG_FORBIDDEN:Reg_Forbidden(hDlg);return 0;case IDC_REG_RECO:Reg_Reco(hDlg);return 0;case IDC_EXIT:EndDialog(hDlg, NULL);default:return 0;}} return FALSE; }int Add_Key(HWND hDlg, LPCTSTR filename){HKEY hKey;LPCTSTR lpRun = L"software\\Microsoft\\Windows\\CurrentVersion\\Run";//打开注册表long result=RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey); if(result==ERROR_SUCCESS){MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);//添加注册表键值 result=RegSetValueEx(hKey, L"greedy snake", 0, REG_SZ, (BYTE *)filename, 100);if (result == ERROR_SUCCESS){MessageBox(hDlg, TEXT("成功添加注册表键值"), TEXT("成功"), MB_OK);}else{MessageBox(hDlg, TEXT("添加注册表键值失败"), TEXT("失败"), MB_OK);//printf("%d\n", result);}}else{MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);}RegCloseKey(hKey);return 0;}int Change_IE_Mainpage(HWND hDlg){HKEY hKey;TCHAR mainpage[100];LPCTSTR lpRun = L"S-1-5-21-455092624-2783291490-1266880768-1000\\Software\\Microsoft\\Internet Explorer\\Main";GetDlgItemText(hDlg, IDC_EDIT2, mainpage, 100);//打开注册表long result=RegOpenKeyEx(HKEY_USERS, lpRun, 0, KEY_WRITE, &hKey); if(result==ERROR_SUCCESS){MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);//添加注册表键值 result=RegSetValueEx(hKey, L"Start Page", 0, REG_SZ, (BYTE *)mainpage, 100);if (result == ERROR_SUCCESS){MessageBox(hDlg, TEXT("更改IE默认主页成功"), TEXT("成功"), MB_OK);}else{MessageBox(hDlg, TEXT("更改IE默认主页失败"), TEXT("失败"), MB_OK);//printf("%d\n", result);}}else{MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);}RegCloseKey(hKey);return 0;}int Change_Exe_Rela(HWND hDlg){HKEY hKey;TCHAR mainpage[100] = L"F:\\成品小软件\\贪吃蛇.exe";LPCTSTR lpRun = L"exefile\\shell\\open\\command";//GetDlgItemText(hDlg, IDC_EDIT2, mainpage, 100);//打开注册表long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey); if(result==ERROR_SUCCESS){MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);//添加注册表键值 result=RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)mainpage, 100);if (result == ERROR_SUCCESS){MessageBox(hDlg, TEXT("更改exe关联成功"), TEXT("成功"), MB_OK);}else{MessageBox(hDlg, TEXT("更改exe关联失败"), TEXT("失败"), MB_OK);//printf("%d\n", result);}}else{MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);}RegCloseKey(hKey);return 0;}int Change_Exe_Reco(HWND hDlg){HKEY hKey;TCHAR mainpage[100] = L"\"%1\" %*";LPCTSTR lpRun = L"exefile\\shell\\open\\command";//打开注册表long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey); if(result==ERROR_SUCCESS){MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);//添加注册表键值 result=RegSetValueEx(hKey, NULL, 0, REG_SZ, (BYTE *)mainpage, 100);if (result == ERROR_SUCCESS){MessageBox(hDlg, TEXT("恢复exe关联成功"), TEXT("成功"), MB_OK);}else{MessageBox(hDlg, TEXT("恢复exe关联失败"), TEXT("失败"), MB_OK);//printf("%d\n", result);}}else{MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);}RegCloseKey(hKey);return 0;}int Change_Txt_Rela(HWND hDlg){HKEY hKey;TCHAR mainpage[100] = L"C:\\Windows\\System32\\cmd.exe";LPCTSTR lpRun = L"txtfile\\shell\\open\\command";//打开注册表long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey); if(result==ERROR_SUCCESS){MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);//添加注册表键值 result=RegSetValueEx(hKey, NULL, 0, REG_EXPAND_SZ, (BYTE *)mainpage, 100);if (result == ERROR_SUCCESS){MessageBox(hDlg, TEXT("修改txt关联成功"), TEXT("成功"), MB_OK);}else{MessageBox(hDlg, TEXT("修改txt关联失败"), TEXT("失败"), MB_OK);//printf("%d\n", result);}}else{MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);}RegCloseKey(hKey);return 0;}int Change_Txt_Reco(HWND hDlg){HKEY hKey;TCHAR mainpage[100] = L"%SystemRoot%\\system32\\NOTEPAD.EXE %1";LPCTSTR lpRun = L"txtfile\\shell\\open\\command";//打开注册表long result=RegOpenKeyEx(HKEY_CLASSES_ROOT, lpRun, 0, KEY_WRITE, &hKey); if(result==ERROR_SUCCESS){MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);//添加注册表键值 result=RegSetValueEx(hKey, NULL, 0, REG_EXPAND_SZ, (BYTE *)mainpage, 100);if (result == ERROR_SUCCESS){MessageBox(hDlg, TEXT("恢复txt关联成功"), TEXT("成功"), MB_OK);}else{MessageBox(hDlg, TEXT("恢复txt关联失败"), TEXT("失败"), MB_OK);}}else{MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);}RegCloseKey(hKey);return 0;}int Reg_Forbidden(HWND hDlg){HKEY hKey;DWORD DisReg = 0x00000001;LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";//打开注册表long result=RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey); if(result==ERROR_SUCCESS){MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);//添加注册表键值 result=RegSetValueEx(hKey, L"DisableRegistryTools", 0, REG_DWORD, (const BYTE *)&DisReg, sizeof(DisReg));if (result == ERROR_SUCCESS){MessageBox(hDlg, TEXT("禁用注册表成功"), TEXT("成功"), MB_OK);}else{MessageBox(hDlg, TEXT("禁用注册表失败"), TEXT("失败"), MB_OK);}}else{MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);}RegCloseKey(hKey);return 0;}int Reg_Reco(HWND hDlg){HKEY hKey;DWORD DisReg = 0x00000000;LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System";//打开注册表long result=RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_WRITE, &hKey); if(result==ERROR_SUCCESS){MessageBox(hDlg, TEXT("成功打开注册表项"), TEXT("成功"), MB_OK);//添加注册表键值 result=RegSetValueEx(hKey, L"DisableRegistryTools", 0, REG_DWORD, (const BYTE *)&DisReg, sizeof(DisReg));if (result == ERROR_SUCCESS){MessageBox(hDlg, TEXT("恢复禁用注册表成功"), TEXT("成功"), MB_OK);}else{MessageBox(hDlg, TEXT("恢复禁用注册表失败"), TEXT("失败"), MB_OK);}}else{MessageBox(hDlg, TEXT("打开注册表失败"), TEXT("失败"), MB_OK);}RegCloseKey(hKey);return 0;}
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- 注册表编程
- Vbscript编程5---注册表
- 注册表编程扫盲(一)
- 注册表编程扫盲(二)
- 用内部类实现java多重实现中的方法同名问题
- normalize()错误
- 在 Windows 中实现 Java 本地方法
- Eclipse中用JDBC连接SQL Server 2005
- 【Directshow学习日记】(二) FilterTitleOverlay 编译的错误
- 注册表编程
- .bash_profile和.bashrc的什么区别
- wcf data service 地址栏增删改
- windows xp下配置JDK环境变量
- WebGame中UI的层次管理
- jdk1.6环境变量配置问题解决
- 决定做一个属于自己的作品,从今天开始调研
- Linux环境进程间通信(二上) from IBM developerWorks 作者:郑彦兴 (mlinux@163.com)国防科大
- ubuntu gedit显示中文乱码