3,881
社区成员
发帖
与我相关
我的任务
分享
#ifndef _TRACE
#define _TRACE(fmt, ...) OutputDebugString(fmt, __VA_ARGS__)
#endif
#define STRNAMESPACE _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\")
#define STRCLSID _T("SOFTWARE\\Classes\\CLSID\\") // 设置图标到我的电脑
// lpszProPath省略 默认给本程序添加图标到我的电脑,否则给指定程序添加图标到我的电脑
BOOL CreateSubkey(HKEY hKey, LPCTSTR lpszSubkey, HKEY& hResult)
{
DWORD dwDisposition = REG_CREATED_NEW_KEY;
if (ERROR_SUCCESS != RegCreateKeyEx(HKEY_LOCAL_MACHINE, lpszSubkey, 0, REG_NONE,
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS | KEY_WOW64_64KEY, NULL, &hResult, &dwDisposition))
{
_TRACE(_T("NameSpace:写注册表%s项失败!\n"), lpszSubkey);
return FALSE;
}
return TRUE;
}
BOOL WriteRegValue(HKEY hKey,LPCTSTR lpszValueName, LPCTSTR lpszValue, DWORD dwType = REG_SZ)
{
if (ERROR_SUCCESS != RegSetValueExA(hKey, lpszValueName, 0, dwType, (BYTE*)lpszValue, sizeof(TCHAR)*(_tcsclen(lpszValue) + 2*sizeof(TCHAR))))
{
_TRACE(_T("NameSpace:写注册表键值%s失败!\n"), lpszValue);
return FALSE;
}
return TRUE;
}
BOOL DelRegKey(HKEY hMainKey, LPCTSTR lpszSubkey)
{
HKEY hResult = NULL;
if (ERROR_SUCCESS == RegOpenKeyEx(hMainKey, lpszSubkey, 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hResult))
{
DWORD dwCount = 0;
if(RegQueryInfoKey(hResult,NULL,NULL,NULL,&dwCount,NULL,NULL,NULL,NULL,NULL,NULL,NULL)==ERROR_SUCCESS)
{
TCHAR szName[MAX_PATH] = {0};
for (int i = 0; i < dwCount; ++i)
{
if (ERROR_SUCCESS == RegEnumKey(hResult, i, szName, MAX_PATH))
{
if (ERROR_SUCCESS != RegDeleteKey(hResult, szName))
{
_TRACE(_T("删除[%s][%s]项失败\n"), lpszSubkey, szName);
}
}
}
}
if (ERROR_SUCCESS != RegDeleteKey(hResult, _T("")))
{
_TRACE(_T("删除%s项失败\n"), lpszSubkey);
}
RegCloseKey(hResult);
return TRUE;
}
return FALSE;
}
BOOL SetProgramToNameSpace(LPCTSTR lpszGUID, LPCTSTR lpszKeyName, LPCTSTR lpszInfoTip, LPCTSTR lpszAuthor, LPCTSTR lpszProPath = NULL)
{
BOOL bSuccess = FALSE;
HKEY hSubKeyCLSID = NULL;
HKEY hSubKeyDefault = NULL;
HKEY hSubKeyShell = NULL;
HKEY hSubKeyOpen = NULL;
HKEY hSubKeyCommand = NULL;
HKEY hSubKeyNameSpace = NULL;
try
{
// CLSID
TCHAR szSubKey[MAX_PATH] = {0};
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s"), STRCLSID, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyCLSID))
{
throw(_T("CLSID:创建注册表%s项失败!\n"), lpszGUID);
}
if (!WriteRegValue(hSubKeyCLSID, NULL, lpszKeyName))
{
throw(_T("CLSID:写注册表[][%s]项失败!\n"), lpszKeyName);
}
if (!WriteRegValue(hSubKeyCLSID, _T("InfoTip"), lpszInfoTip))
{
throw(_T("CLSID:写注册表[%s][%s]项失败!\n"), _T("InfoTip"), lpszInfoTip);
}
if (!WriteRegValue(hSubKeyCLSID, _T("System.ItemAuthors"), lpszAuthor))
{
throw(_T("CLSID:写注册表[%s][%s]项失败!\n"), _T("System.ItemAuthors"), lpszAuthor);
}
if (!WriteRegValue(hSubKeyCLSID, _T("TileInfo"), _T("prop:System.ItemAuthors")))
{
throw(_T("CLSID:写注册表[%s][%s]项失败!\n"), _T("TileInfo"), _T("prop:System.ItemAuthors"));
}
TCHAR szExePath[MAX_PATH] = {0};
if (NULL == lpszProPath)
{
GetModuleFileName(NULL, szExePath, MAX_PATH);
}
else
{
strcpy_s(szExePath, MAX_PATH, lpszProPath);
}
// DefaultIcon
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s\\DefaultIcon"), STRCLSID, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyDefault))
{
throw(_T("CLSID:创建注册表%s项失败!\n"), _T("DefaultIcon"));
}
if (!WriteRegValue(hSubKeyDefault, NULL, szExePath))
{
throw(_T("CLSID-DefaultIcon:写注册表[][%s]项失败!\n"), szExePath);
}
// shell
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s\\shell"), STRCLSID, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyShell))
{
throw(_T("CLSID:创建注册表%s项失败!\n"), _T("shell"));
}
// shell\Open
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s\\shell\\Open"), STRCLSID, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyOpen))
{
throw(_T("CLSID:创建注册表%s项失败!\n"), _T("Open"));
}
// shell\Open\Command
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s\\shell\\Open\\Command"), STRCLSID, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyCommand))
{
throw(_T("CLSID:创建注册表%s项失败!\n"), _T("Command"));
}
if (!WriteRegValue(hSubKeyCommand, NULL, szExePath))
{
throw(_T("CLSID-Command:写注册表[][%s]项失败!\n"), szExePath);
}
// NameSpace
_stprintf_s(szSubKey, MAX_PATH, _T("%s%s"), STRNAMESPACE, lpszGUID);
if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyNameSpace))
{
throw(_T("NameSpace:创建注册表[%s]项失败!\n"), lpszGUID);
}
if (!WriteRegValue(hSubKeyNameSpace, NULL, lpszKeyName))
{
throw(_T("NameSpace:写注册表键值[][%s]失败!\n"), lpszKeyName);
}
bSuccess = TRUE;
}
catch (TCHAR *pError)
{
_TRACE("%s", pError);
}
if (NULL != hSubKeyNameSpace)
{
RegCloseKey(hSubKeyNameSpace);
}
if (NULL != hSubKeyCommand)
{
RegCloseKey(hSubKeyCommand);
}
if (NULL != hSubKeyOpen)
{
RegCloseKey(hSubKeyOpen);
}
if (NULL != hSubKeyShell)
{
RegCloseKey(hSubKeyShell);
}
if (NULL != hSubKeyDefault)
{
RegCloseKey(hSubKeyDefault);
}
if (NULL != hSubKeyCLSID)
{
RegCloseKey(hSubKeyCLSID);
}
return bSuccess;
}
void DelSubKey(LPCTSTR lpszGUID)
{
TCHAR szSubKey[MAX_PATH] = {0};
_stprintf_s(szSubKey, _T("%s%s"), STRNAMESPACE,lpszGUID);
DelRegKey(HKEY_LOCAL_MACHINE, szSubKey);
_stprintf_s(szSubKey, _T("%s%s\\DefaultIcon"), STRCLSID, lpszGUID);
DelRegKey(HKEY_LOCAL_MACHINE, szSubKey);
_stprintf_s(szSubKey, _T("%s%s\\shell\\Open\\Command"), STRCLSID, lpszGUID);
DelRegKey(HKEY_LOCAL_MACHINE, szSubKey);
_stprintf_s(szSubKey, _T("%s%s\\shell\\Open"), STRCLSID, lpszGUID);
DelRegKey(HKEY_LOCAL_MACHINE, szSubKey);
_stprintf_s(szSubKey, _T("%s%s\\shell"), STRCLSID, lpszGUID);
DelRegKey(HKEY_LOCAL_MACHINE, szSubKey);
_stprintf_s(szSubKey, _T("%s%s"), STRCLSID, lpszGUID);
DelRegKey(HKEY_LOCAL_MACHINE, szSubKey);
}
void CdialogTestDlg::OnBnClickedChkShowincomputer()
{
// TODO: 在此添加控件通知处理程序代码
//CString strGUID = _T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C7}");
CString strGUID = _T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C8}");
BOOL bCheck = ((CButton*)GetDlgItem(IDC_CHK_SHOWINCOMPUTER))->GetCheck();
if (bCheck)
{
CString strExePath;
GetDlgItemText(IDC_EDIT_FILE, strExePath);
if (strExePath.Trim().IsEmpty())
{
SetProgramToNameSpace(strGUID.GetString(), _T("测试"), _T("infoTip"), _T("author"));
}
else
{
SetProgramToNameSpace(strGUID.GetString(), _T("测试"), _T("infoTip"), _T("author"), strExePath.GetString());
}
}
else
{
DelSubKey(strGUID.GetString());
}
}
void CdialogTestDlg::OnBnClickedChkShowincomputer2()
{
// TODO: 在此添加控件通知处理程序代码
BOOL bCheck = ((CButton*)GetDlgItem(IDC_CHK_SHOWINCOMPUTER2))->GetCheck();
CString strGUID = _T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C7}");
//CString strGUID = _T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C8}");
if (bCheck)
{
CString strExePath;
GetDlgItemText(IDC_EDIT_FILE, strExePath);
if (strExePath.Trim().IsEmpty())
{
SetProgramToNameSpace(strGUID.GetString(), _T("测试2"), _T("infoTip"), _T("author"));
}
else
{
SetProgramToNameSpace(strGUID.GetString(), _T("测试2"), _T("infoTip"), _T("author"), strExePath.GetString());
}
}
else
{
DelSubKey(strGUID.GetString());
}
}