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 + -
显示快捷键?