注册表编程

接着昨天的折腾。

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

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

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

举个例子来说,扩展名子键是.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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值