registertable.cpp

来自「◆◆◆ 《投掷飞镖记分工具》◆◆◆ 操作系统 : Windows Mobil」· C++ 代码 · 共 686 行 · 第 1/2 页

CPP
686
字号
		csFileTypeDesc_FromReg.ReleaseBuffer ();
		if ( csFileTypeDesc_FromReg.IsEmpty() )
			bNeedSetFileTypeDesc = TRUE;
		else
			csFileTypeDesc = csFileTypeDesc_FromReg;
	}
	// 创建新的扩展名子键
	else
	{
		dwBufSize = csFileTypeDesc.GetLength();
		if ( !CreateRegisterSubKey ( HKEY_CLASSES_ROOT, csExtensionName, &hKey ) )
			return FALSE;
		bNeedSetFileTypeDesc = TRUE;
	}
	ASSERT ( hKey );
	RegCloseKey(hKey);
	hKey = NULL;

	// 设置文件类型描述字符串
	if ( bNeedSetFileTypeDesc )
	{
		dwBufSize = csFileTypeDesc.GetLength();
		if ( !WriteRegister ( HKEY_CLASSES_ROOT, csExtensionName,
			_T(""), REG_EXPAND_SZ, (PUCHAR)csFileTypeDesc.GetBuffer(0),&dwBufSize) )
			return FALSE;
	}

	if ( !bExistFileType )
	{
		// 设置该文件类型对应的图标
		csSubKey.Format ( _T("%s\\DefaultIcon"), csFileTypeDesc );
		if ( !CreateRegisterSubKey ( HKEY_CLASSES_ROOT, csSubKey ) )
			return FALSE;
		dwBufSize = csIconParameter.GetLength();
		if ( !WriteRegister ( HKEY_CLASSES_ROOT, csSubKey,
			_T(""), REG_EXPAND_SZ, (PUCHAR)csIconParameter.GetBuffer(0),&dwBufSize) )
			return FALSE;

		// 设置该文件类型打开时的程序和参数
		csSubKey.Format ( _T("%s\\shell\\open\\command"), csFileTypeDesc );
		if ( !CreateRegisterSubKey ( HKEY_CLASSES_ROOT, csSubKey ) )
			return FALSE;
		dwBufSize = csOpenCommand.GetLength();
		if ( !WriteRegister ( HKEY_CLASSES_ROOT, csSubKey,
			_T(""), REG_EXPAND_SZ, (PUCHAR)csOpenCommand.GetBuffer(0),&dwBufSize) )
			return FALSE;
	}

	return TRUE;
}
//
// 为一个文件类型添加菜单
//
BOOL AddFileTypeMenu (
		CString csFileTypeDesc,		// 文件类型,如:"txtfile"
		CString csMenuName,			// 菜单名,如:"Open with notepad"
		CString csCommandPara,		// 点该菜单时所用的的程序和参数,如:"%SystemRoot%\system32\NOTEPAD.EXE %1"
		BOOL bDeleteIfExist			// 存在时是否删除重新注册
	)
{
	if ( csFileTypeDesc.IsEmpty () )
		return FALSE;

	CString csSubKey;
	csSubKey.Format ( _T("%s\\shell\\%s\\command"), csFileTypeDesc, csMenuName );
	HKEY hKey = NULL;
	DWORD dwBufSize = 0;

	if ( RegOpenKeyEx ( HKEY_CLASSES_ROOT,
				csSubKey,
				0,
				KEY_ALL_ACCESS,
				&hKey ) == ERROR_SUCCESS )
	{
		RegCloseKey(hKey);
		hKey = NULL;
		if ( bDeleteIfExist )
		{
			RegDeleteAllSubKey ( HKEY_CLASSES_ROOT, csSubKey );
		}
		else
		{
			return TRUE;
		}
	}

	if ( !CreateRegisterSubKey ( HKEY_CLASSES_ROOT, csSubKey ) )
		return FALSE;
	dwBufSize = csCommandPara.GetLength();
	if ( !WriteRegister ( HKEY_CLASSES_ROOT, csSubKey,
		_T(""), REG_EXPAND_SZ, (PUCHAR)csCommandPara.GetBuffer(0),&dwBufSize) )
		return FALSE;

	return TRUE;
}

//
// 删除一个文件类型的菜单
//
BOOL DeleteFileTypeMenu (
		CString csExtensionName,	// 扩展名,如:"txt"
		CString csMenuName			// 菜单名,如:"Open with notepad"
	)
{
	if ( !StandardExtensionName(csExtensionName) )
		return FALSE;

	CString csFileTypeDesc = GetFileTypeDescFromReg ( csExtensionName );
	CString csSubKey;
	if ( !csFileTypeDesc.IsEmpty () )
	{
		csSubKey.Format ( _T("%s\\shell\\%s"), csFileTypeDesc, csMenuName );
		if ( !RegDeleteAllSubKey ( HKEY_CLASSES_ROOT, csSubKey ) )
			return FALSE;
	}

	csSubKey.Format ( _T("%s\\shell\\%s"), csExtensionName, csMenuName );
	RegDeleteAllSubKey ( HKEY_CLASSES_ROOT, csSubKey );

	return TRUE;
}

//
// 删除一个文件类型
//
BOOL DeleteFileType ( CString csExtensionName )
{
	if ( !StandardExtensionName(csExtensionName) )
		return FALSE;

	CString csFileTypeDesc = GetFileTypeDescFromReg ( csExtensionName );
	if ( !csFileTypeDesc.IsEmpty () )
	{
		if ( !RegDeleteAllSubKey ( HKEY_CLASSES_ROOT, csFileTypeDesc ) )
			return FALSE;
	}
	if ( !RegDeleteAllSubKey ( HKEY_CLASSES_ROOT, csExtensionName ) )
		return FALSE;

	return TRUE;
}

BOOL KeyOrNameIsMatch ( LPCTSTR lpszSearchText, ENUM_SEARCH_TYPE eSearchType, CString csSubKey, CString csKeyName, CString csKeyValue )
{
	ASSERT ( lpszSearchText && lstrlen(lpszSearchText) > 0 );
	switch ( eSearchType )
	{
	case ENUM_SEARCH_TYPE_WHOLE_MATCH:
		{
			if ( (!csSubKey.IsEmpty() && csSubKey == lpszSearchText ) ||
				(!csKeyName.IsEmpty() && csKeyName == lpszSearchText ) ||
				( !csKeyValue.IsEmpty() && csKeyValue == lpszSearchText ) )
				return TRUE;
			break;
		}
	case ENUM_SEARCH_TYPE_INCLUDE:
		{
			if ( (!csSubKey.IsEmpty() && csSubKey.Find(lpszSearchText,0)>=0) ||
				(!csKeyName.IsEmpty() && csKeyName.Find(lpszSearchText,0)>=0) ||
				(!csKeyValue.IsEmpty() && csKeyValue.Find(lpszSearchText,0)>=0 ) )
				return TRUE;
			break;
		}
	case ENUM_SEARCH_TYPE_AT_HEAD:
		{
			if ( (!csSubKey.IsEmpty() && csSubKey.Find(lpszSearchText,0)==0) ||
				(!csKeyName.IsEmpty() && csKeyName.Find(lpszSearchText,0)==0) ||
				(!csKeyValue.IsEmpty() && csKeyValue.Find(lpszSearchText,0)==0 ) )
				return TRUE;
			break;
		}
	case ENUM_SEARCH_TYPE_AT_TAIL:
		{
			int nLenSearchText = lstrlen(lpszSearchText);
			if ( (!csSubKey.IsEmpty() && csSubKey.Find(lpszSearchText,0)==csSubKey.GetLength()-nLenSearchText) ||
				(!csKeyName.IsEmpty() && csKeyName.Find(lpszSearchText,0)==csKeyName.GetLength()-nLenSearchText) ||
				(!csKeyValue.IsEmpty() && csKeyValue.Find(lpszSearchText,0)==csKeyValue.GetLength()-nLenSearchText ) )
				return TRUE;
			break;
		}
	case ENUM_SEARCH_TYPE_NOT_MATCH:
		{
			if ( (!csSubKey.IsEmpty() && csSubKey.Find(lpszSearchText,0)<0) &&
				(!csKeyName.IsEmpty() && csKeyName.Find(lpszSearchText,0)<0) &&
				(!csKeyValue.IsEmpty() && csKeyValue.Find(lpszSearchText,0)<0 ) )
				return TRUE;
			break;
		}
	}
	
	return FALSE;
}

//
// 从注册表中搜索一个字符串
//
BOOL RegSearch (
		IN LPCTSTR lpszSearchText,			// 要搜索的字符串
		IN ENUM_SEARCH_TYPE eSearchType,	// 搜索类型
		IN HKEY mainKey,					// 如: HKEY_CLASSES_ROOT; HKEY_CURRENT_CONFIG; HKEY_CURRENT_USER; 等等
		IN LPCTSTR lpszSubKey,				// 如: "SOFTWARE\\MySoft\\"
		IN BOOL bSearchKeyNameValue,		// 搜索键名和键值
		OUT CStringArray &StrAry_SubKey,	// 搜索到的子键
		OUT CStringArray &StrAry_KeyName,	// 搜索到的键名
		OUT CStringArray &StrAry_KeyValue,	// 搜索到的键值
		HWND hWndRecvMsg
	)
{
	if ( !lpszSearchText ) return FALSE;
	int nLenSearchText = lstrlen(lpszSearchText);
	if ( nLenSearchText < 1 ) return FALSE;
	if ( !lpszSubKey ) return FALSE;
	
	CString csSubKeyLeft, csSubKeyRight;
	csSubKeyRight = PartKeyBySubKey ( lpszSubKey, &csSubKeyLeft );
	if ( ::IsWindow ( hWndRecvMsg ) )
	{
		DWORD dwNow = GetTickCount ();
		if ( dwNow - g_dwLastSendMsgTime > 100 )
		{
			::SendMessage ( hWndRecvMsg, WM_REG_SEARCH, WPARAM(_T("SEARCH")), LPARAM(LPCTSTR(csSubKeyRight)) );
			g_dwLastSendMsgTime = dwNow;
		}
	}

	if ( KeyOrNameIsMatch ( lpszSearchText, eSearchType, csSubKeyLeft, _T(""), _T("") ) )
	{
		StrAry_SubKey.Add ( lpszSubKey );
		StrAry_KeyName.Add ( _T("") );
		StrAry_KeyValue.Add ( _T("") );
		TRACE ( _T("Found : %s\n"), lpszSubKey );
	}
	//打开注册表子键
	HKEY hKey = NULL;
	if ( RegOpenKeyEx ( mainKey, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey ) != ERROR_SUCCESS )
	{
		return FALSE;
	}

	// 枚举键值并分别处理
	int		index = 0;	
	while ( bSearchKeyNameValue )
	{
		TCHAR	szKeyName[MAX_KEY_LENGTH] = {0};
		DWORD	nKeyNameLength = MAX_KEY_LENGTH;
		DWORD	dwType = 0;
		TCHAR	szKeyValue[MAX_KEY_LENGTH] = {0};
		DWORD	dwKeyValueLength = MAX_KEY_LENGTH;

		if ( RegEnumValue ( hKey, index, szKeyName ,&nKeyNameLength, NULL,
			&dwType, (LPBYTE)szKeyValue, &dwKeyValueLength ) != ERROR_SUCCESS )
		{
			break;
		}

		if ( dwType == REG_EXPAND_SZ || dwType == REG_MULTI_SZ || dwType == REG_SZ )
		{
//			TRACE ( _T("RegEnumValue() : %s = %s\n"), szKeyName, szKeyValue );
			if ( KeyOrNameIsMatch ( lpszSearchText, eSearchType, _T(""), szKeyName, szKeyValue ) )
			{
				StrAry_SubKey.Add ( lpszSubKey );
				StrAry_KeyName.Add ( szKeyName );
				StrAry_KeyValue.Add ( szKeyValue );
				TRACE ( _T("Found : %s, %s, %s\n"), lpszSubKey, szKeyName, szKeyValue );
			}

		}
		index++;
	}

	// 首先查得当前键下的子键项数,依次处理每个子键
	ULONG numSubKey = 0;
	RegQueryInfoKey ( hKey, NULL, NULL, NULL, &numSubKey, NULL, NULL, NULL, NULL, NULL, NULL, NULL );
	for ( ULONG i=0; i<numSubKey; i++)
	{
		TCHAR szEnumSubKey[MAX_KEY_LENGTH] = {0};
		ULONG nSubKeySize = MAX_KEY_LENGTH;
		
		if ( ERROR_SUCCESS == RegEnumKeyEx ( hKey, i,szEnumSubKey, &nSubKeySize, NULL, NULL, NULL, NULL ) &&
			lstrlen(szEnumSubKey) > 0 )
		{
			CString csSubKey = lpszSubKey;
			if ( !csSubKey.IsEmpty() && csSubKey.GetAt(csSubKey.GetLength()-1)!=_T('\\') )
				csSubKey += _T("\\");
			csSubKey += szEnumSubKey;
			csSubKey += _T("\\");
			//		TRACE ( _T("RegEnumKeyEx() : %s\n"), csSubKey );
			RegSearch ( lpszSearchText, eSearchType, mainKey, csSubKey, bSearchKeyNameValue,
				StrAry_SubKey, StrAry_KeyName, StrAry_KeyValue, hWndRecvMsg );
		}
	}

	//关闭键
	RegCloseKey(hKey);

	return TRUE;
}


//
// 添加一个自动启动的程序
//
BOOL AddAutoRunProgram ( LPTSTR lpszDesc, LPCTSTR lpszArguments/*=NULL*/, LPCTSTR lpszProgramPath/*=NULL*/ )
{
	TCHAR szModulePath[MAX_PATH] = {0};
	szModulePath[0] = _T('\"');
	if ( lpszProgramPath )
	{
		lstrcpyn ( szModulePath+1, lpszProgramPath, MAX_PATH );
	}
	else
	{
		::GetModuleFileName(NULL,szModulePath+1,MAX_PATH-1);
	}
	strncat_hw ( szModulePath, _T("\""), MAX_PATH-1 );

	if ( lpszArguments && lstrlen(lpszArguments) > 0 )
	{
		strncat_hw ( szModulePath, _T(" "), sizeof(szModulePath) );
		strncat_hw ( szModulePath, lpszArguments, sizeof(szModulePath) );
	}

	DWORD dwBufSize = lstrlen(szModulePath)*sizeof(TCHAR);
	CString csSubKey = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run\\");
	if ( !WriteRegister ( HKEY_LOCAL_MACHINE, csSubKey,
		lpszDesc, REG_EXPAND_SZ, (PUCHAR)szModulePath,&dwBufSize) )
	{
		return FALSE;
	}

	return TRUE;
}

//
// 删除一个自动自动的程序
//
BOOL DeleteAutoRunProgram ( LPTSTR lpszDesc/*=NULL*/ )
{
	if ( !lpszDesc ) lpszDesc = (LPTSTR)::AfxGetAppName();
	CString csSubKey = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run\\");
	return DeleteValueRegister ( HKEY_LOCAL_MACHINE, csSubKey, lpszDesc );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?