📄 association.cpp
字号:
wsprintf(szBuf, _T("%s\\Shell\\Open\\Command"), szSubKey);
//僐儅儞僪儔僀儞庢摼
//HKEY_CLASSES_ROOT-傾僾儕働乕僔儑儞柤-Shell-Open-Command-(嬻敀)
if(ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szBuf, 0,
_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyWk, &dwDisposition))
continue;
dwType = REG_SZ;
dwDataSize = sizeof(szTemp);
if (ERROR_SUCCESS!=RegQueryValueEx(hKeyWk, _T(""), 0, &dwType, lpData, &dwDataSize))
{
RegCloseKey(hKeyWk);
continue;
}
RegCloseKey(hKeyWk);
memset(szTemp, 0x00, sizeof(szTemp));
memcpy(szTemp, lpData, dwDataSize);
//傾僾儕働乕僔儑儞柤
//HKEY_CLASSES_ROOT-傾僾儕働乕僔儑儞柤-(嬻敀)
hKeyWk = 0;
if(ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szSubKey, 0,
_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyWk, &dwDisposition))
continue;
dwType = REG_SZ;
dwDataSize = sizeof(szAppName);
if (ERROR_SUCCESS!=RegQueryValueEx(hKeyWk, _T(""), 0, &dwType, lpData, &dwDataSize))
{
RegCloseKey(hKeyWk);
continue;
}
RegCloseKey(hKeyWk);
memset(szAppName, 0x00, sizeof(szAppName));
memcpy(szAppName, lpData, dwDataSize);
//傾僀僐儞ID(儕僜乕僗ID)
//HKEY_CLASSES_ROOT-傾僾儕働乕僔儑儞柤-DefaultIcon
wsprintf(szBuf, _T("%s\\DefaultIcon"), szSubKey);
hKeyWk = 0;
if(ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szBuf, 0,
_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyWk, &dwDisposition))
continue;
nIconID = 0;
dwType = REG_SZ;
dwDataSize = MAX_PATH*sizeof(TCHAR);
if (ERROR_SUCCESS==RegQueryValueEx(hKeyWk, _T(""), 0, &dwType, lpData, &dwDataSize))
{
TCHAR szIconBuf[MAX_PATH];
memset(szIconBuf, 0x00, sizeof(szIconBuf));
memcpy(szIconBuf, lpData, dwDataSize);
LPTSTR lpszTemp = wcsrchr(szIconBuf, _T(','));
if(lpszTemp)
{
*lpszTemp = 0x00;
wcscpy(szIconPath, szIconBuf);
nIconID = wcstol((lpszTemp+1), 0, 10);
}
}
RegCloseKey(hKeyWk);
//搊榐敾掕
LPTSTR lpszStart = szTemp;
if(lpszStart[0] == _T('\"')) lpszStart++;
LPTSTR lpszEnd = lpszStart;
for(;;)
{
lpszEnd = wcschr(lpszEnd, _T('.'));
if(!lpszEnd) break;
TCHAR szExt[4];
memset(szExt, 0x00, sizeof(szExt));
wcsncpy(szExt, ++lpszEnd, 3);
if(0==wcsicmp(szExt, _T("EXE")))
{
lpszEnd+=3;
*lpszEnd=0x00;
break;
}
} //End of for
//庢摼幐攕偺応崌
if(!lpszEnd) continue;
//梋暘側嬻敀傪嶍彍
lpszEnd++;
while(lpszEnd)
{
if(*lpszEnd != _T(' ')) break;
lpszEnd++;
} //End of while
wcscpy(szCommand, lpszEnd);
wcscpy(szAppPath, lpszStart);
//僷僗偑側偄応崌偼"\Windows"僼僅儖僟偲偡傞
if(0!=wcslen(szAppPath) && !wcschr(szAppPath, _T('\\')))
{
TCHAR szAppBuf[MAX_PATH];
wcscpy(szAppBuf, szAppPath);
wsprintf(szAppPath, _T("%s\\%s"), g_MainWnd.m_szWindowsPath, szAppBuf);
}
if(0!=wcslen(szIconPath) && !wcschr(szIconPath, _T('\\')))
{
TCHAR szAppBuf[MAX_PATH];
wcscpy(szAppBuf, szIconPath);
wsprintf(szIconPath, _T("%s\\%s"), g_MainWnd.m_szWindowsPath, szAppBuf);
}
//傾僾儕働乕僔儑儞偑側偄応崌偼柍帇
if(GetFileAttributes(szAppPath) == 0xFFFFFFFF)
continue;
//庢摼僨乕僞奿擺
APPLICATIONLIST *lpList = new APPLICATIONLIST;
//1.奼挘巕
lpList->lpszExt = new TCHAR[wcslen(szExt)];
wcscpy(lpList->lpszExt, (szExt+1));
//2.僉乕柤
lpList->lpszKeyName = new TCHAR[wcslen(szSubKey)+1];
wcscpy(lpList->lpszKeyName, szSubKey);
//3.傾僾儕働乕僔儑儞柤
lpList->lpszAppName = new TCHAR[wcslen(szAppName)+1];
wcscpy(lpList->lpszAppName, szAppName);
//4.傾僾儕働乕僔儑儞僷僗
lpList->lpszAppPath = new TCHAR[wcslen(szAppPath)+1];
wcscpy(lpList->lpszAppPath, szAppPath);
//5.僐儅儞僪儔僀儞
lpList->lpszCommand = new TCHAR[wcslen(szCommand)+1];
wcscpy(lpList->lpszCommand, szCommand);
//6.傾僀僐儞
lpList->lpszIconPath = new TCHAR[wcslen(szIconPath)+1];
lpList->nIconID = nIconID;
//7.僀儊乕僕儕僗僩僀儞僨僢僋僗
lpList->nImageIndex = 0;
//8.師儗僐乕僪億僀儞僞
lpList->lpNext = NULL;
//儕僗僩偺楢寢
if(lpOldList) lpOldList->lpNext = lpList;
//愭摢傾僪儗僗曐懚
if(!m_lpAppList) m_lpAppList = lpList;
//師偺儗僐乕僪偺弨旛
lpOldList = lpList;
} //End of for
delete[] lpData;
//儗僕僗僩儕僉乕偺僋儘乕僘
RegCloseKey(hKey);
return;
}
///////////////////////////////////////////////////////////////
void CAssociation::DeleteAppList()
{
//傾僾儕働乕僔儑儞儕僗僩嶍彍
while(m_lpAppList)
{
APPLICATIONLIST *lpList = NULL;
lpList = m_lpAppList;
m_lpAppList = lpList->lpNext;
delete[] lpList->lpszExt;
delete[] lpList->lpszKeyName;
delete[] lpList->lpszAppName;
delete[] lpList->lpszAppPath;
delete[] lpList->lpszCommand;
delete[] lpList->lpszIconPath;
delete lpList;
} //End of while;
return;
}
///////////////////////////////////////////////////////////////
BOOL CAssociation::SetApplication(LPTSTR lpszPath, LPTSTR lpszKeyName, LPTSTR lpszAppName, LPTSTR lpszParam, LPTSTR lpszIconPath, int nIconID)
{
//僂傿儞僪僂僘僼僅儖僟偺応崌偼僷僗傪嶍彍偡傞
TCHAR szPath[MAX_PATH];
wcscpy(szPath, lpszPath);
LPTSTR lpszTemp = wcsrchr(szPath, _T('\\'));
if(lpszTemp)
{
*lpszTemp = 0x00;
if(0==wcsicmp(g_MainWnd.m_szWindowsPath, szPath))
lpszPath = ++lpszTemp;
}
//僉乕柤嶌惉
TCHAR szKeyName[MAX_PATH];
memset(szKeyName, 0x00, sizeof(szKeyName));
if(lpszKeyName)
wcscpy(szKeyName, lpszKeyName);
else
{
//僷僗偺暘夝
LPTSTR lpszStart = wcsrchr(lpszPath, _T('\\'));
if(!lpszStart)
lpszStart = lpszPath;
else
lpszStart++;
LPTSTR lpszEnd = wcsrchr(lpszStart, _T('.'));
if(lpszEnd)
wcsncpy(szKeyName, lpszStart, (lpszEnd-lpszStart));
else
wcscpy(szKeyName, lpszStart);
}
//傾僾儕働乕僔儑儞柤
TCHAR szAppName[MAX_PATH];
memset(szAppName, 0x00, sizeof(szAppName));
wcscpy(szAppName, (lpszAppName?lpszAppName:szKeyName));
//僐儅儞僪儔僀儞
TCHAR szCommand[MAX_PATH];
lpszTemp = wcschr(lpszPath, _T(' '));
if(lpszTemp)
{
//僐儅儞僪儔僀儞嶌惉("僼傽僀儖柤" "%1")
wsprintf(szCommand, _T("\"%s\" %s"),
lpszPath, (lpszParam?lpszParam:_T("\"%1\"")));
}
else
{
//僐儅儞僪儔僀儞嶌惉(僼傽僀儖柤 "%1")
wsprintf(szCommand, _T("%s %s"),
lpszPath, (lpszParam?lpszParam:_T("\"%1\"")));
}
//僨僼僅儖僩傾僀僐儞
TCHAR szDefaultIcon[MAX_PATH];
wsprintf(szDefaultIcon, _T("%s,%d"), (lpszIconPath?lpszIconPath:lpszPath), nIconID);
HKEY hKey;
DWORD dwDisposition;
//儗僕僗僩儕搊榐
//儗僕僗僩儕乕僉乕偺僆乕僾儞1
//HKEY_CLASSES_ROOT-僉乕柤
if (ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szKeyName, 0,
_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition))
return FALSE;
//儗僕僗僩儕偺搊榐1
//HKEY_CLASSES_ROOT-僉乕柤-(嬻敀)"傾僾儕働乕僔儑儞柤"
RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)szAppName, ((wcslen(szAppName)+1) * sizeof(TCHAR)));
//儗僕僗僩儕僉乕偺僋儘乕僘1
RegCloseKey(hKey);
//儗僕僗僩儕乕僉乕偺僆乕僾儞2
//HKEY_CLASSES_ROOT-僉乕柤-Shell-Open-Command
TCHAR szBuf[MAX_PATH];
wsprintf(szBuf, _T("%s\\Shell\\Open\\Command"), szKeyName);
if (ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szBuf, 0,
_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition))
return FALSE;
//儗僕僗僩儕偺搊榐2
//HKEY_CLASSES_ROOT-僉乕柤-Shell-Open-Command-(嬻敀)"僐儅儞僪"
RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)szCommand, ((wcslen(szCommand)+1) * sizeof(TCHAR)));
//儗僕僗僩儕僉乕偺僋儘乕僘2
RegCloseKey(hKey);
//儗僕僗僩儕乕僉乕偺僆乕僾儞3
//HKEY_CLASSES_ROOT-僉乕柤-DefaultIcon
wsprintf(szBuf, _T("%s\\DefaultIcon"), szKeyName);
if (ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, szBuf, 0,
_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition))
return FALSE;
//儗僕僗僩儕偺搊榐3
//HKEY_CLASSES_ROOT-僉乕柤-DefaultIcon-(嬻敀)"僐儅儞僪"
RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)szDefaultIcon, ((wcslen(szDefaultIcon)+1) * sizeof(TCHAR)));
//儗僕僗僩儕僉乕偺僋儘乕僘3
RegCloseKey(hKey);
return TRUE;
}
///////////////////////////////////////////////////////////////
BOOL CAssociation::SetAssociation(LPTSTR lpszKeyName)
{
HKEY hKey;
DWORD dwDisposition;
//儗僕僗僩儕乕僉乕偺僆乕僾儞
//HKEY_CLASSES_ROOT-奼挘巕
if (ERROR_SUCCESS!=RegCreateKeyEx(HKEY_CLASSES_ROOT, m_lpszExt, 0,
_T(""), REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition))
return FALSE;
//儗僕僗僩儕偺搊榐1
//HKEY_CLASSES_ROOT-奼挘巕-(嬻敀)"僉乕柤"
RegSetValueEx(hKey, _T(""), 0, REG_SZ, (LPBYTE)lpszKeyName, ((wcslen(lpszKeyName)+1) * sizeof(TCHAR)));
//儗僕僗僩儕僉乕偺僋儘乕僘1
RegCloseKey(hKey);
return TRUE;
}
///////////////////////////////////////////////////////////////
BOOL CAssociation::DeleteSubKey(LPTSTR lpszSubKey)
{
HKEY hKey;
//儗僕僗僩儕僉乕僆乕僾儞
//HKEY_CLASSES_ROOT-巜掕僒僽僉乕(奼挘巕)
if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_CLASSES_ROOT,lpszSubKey,0,KEY_ALL_ACCESS,&hKey))
return FALSE;
//僒僽僉乕専嶕
BYTE* lpData = new BYTE[MAX_PATH];
APPLICATIONLIST *lpOldList = NULL;
for(int i=0; ;i++)
{
TCHAR szSubKey[MAX_PATH];
TCHAR szTemp[MAX_PATH];
//僒僽僉乕偺庢摼
FILETIME ftime;
DWORD dwDataSize = sizeof(szSubKey);
if(ERROR_SUCCESS!=RegEnumKeyEx(hKey, i, szSubKey, &dwDataSize, NULL, NULL, NULL, &ftime))
break;
//嵞婲屇傃弌偟(僒僽僉乕偺僒僽僉乕嶍彍)
wsprintf(szTemp, _T("%s\\%s"), lpszSubKey, szSubKey);
DeleteSubKey(szSubKey);
} //End of for
//儗僕僗僩儕僉乕偺僋儘乕僘
RegCloseKey(hKey);
//儗僕僗僩儕僉乕僆乕僾儞
//HKEY_CLASSES_ROOT
if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_CLASSES_ROOT,_T(""),0,KEY_ALL_ACCESS,&hKey))
return FALSE;
//儗僕僗僩儕僒僽僉乕嶍彍
//HKEY_CLASSES_ROOT-巜掕僒僽僉乕(奼挘巕)
LONG nRtn = RegDeleteKey(hKey, lpszSubKey);
//儗僕僗僩儕僉乕偺僋儘乕僘
RegCloseKey(hKey);
return (nRtn==ERROR_SUCCESS ? TRUE : FALSE);
}
///////////////////////////////////////////////////////////////
void CAssociation::InitAppImageList(HWND hList)
{
//僀儊乕僕儕僗僩偺嶍彍
ImageList_RemoveAll(m_hImageList);
ImageList_Destroy(m_hImageList);
//僀儊乕僕儕僗僩偺嶌惉
m_hImageList = ImageList_Create(16, 16, ILC_COLOR|ILC_MASK, 1, 2);
//僀儊乕僕儕僗僩偺愝掕
ListView_SetImageList(hList, m_hImageList, LVSIL_SMALL);
APPLICATIONLIST *lpList = m_lpAppList;
for(int i=0; lpList; i++)
{
//僀儊乕僕儕僗僩傊捛壛
SHFILEINFO shfi;
SHGetFileInfo(lpList->lpszAppPath, NULL, &shfi, sizeof(shfi), SHGFI_SMALLICON | SHGFI_ICON);
lpList->nImageIndex = ImageList_AddIcon(m_hImageList, shfi.hIcon);
DestroyIcon(shfi.hIcon);
lpList = lpList->lpNext;
}//End of for
}
///////////////////////////////////////////////////////////////
void CAssociation::DeleteAppImageList()
{
//僀儊乕僕儕僗僩偺嶍彍
if(0!=m_hImageList)
{
ImageList_RemoveAll(m_hImageList);
ImageList_Destroy(m_hImageList);
}
}
///////////////////////////////////////////////////////////////
void CAssociation::LoadAppList(LPTSTR szSelectAppPath)
{
//旕昞帵
ShowWindow(m_hListView, SW_HIDE);
//儕僗僩偺嶍彍
ListView_DeleteAllItems(m_hListView);
//僀儊乕僕儕僗僩嶌惉
InitAppImageList(m_hListView);
APPLICATIONLIST *lpList = m_lpAppList;
for(int i=0; lpList; i++)
{
//傾僀僥儉偺捛壛
LVITEM lvitem;
lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvitem.iItem = i;
lvitem.iSubItem = 0;
lvitem.iImage = lpList->nImageIndex;
lvitem.lParam = (DWORD)lpList;
lvitem.pszText = lpList->lpszAppName;
int nIndex = ListView_InsertItem(m_hListView, &lvitem);
if((szSelectAppPath && 0==wcsicmp(szSelectAppPath, lpList->lpszAppPath)) ||
(!szSelectAppPath && 0==wcsicmp(m_szExtType, lpList->lpszKeyName)))
ListView_SetItemState(m_hListView, nIndex, LVIS_SELECTED, LVIS_SELECTED);
lpList = lpList->lpNext;
}//End of for
//夋柺傪僗僋儘乕儖偝偣慖戰傾僀僥儉傪昞帵
int nItem = ListView_GetNextItem(m_hListView, -1, LVNI_ALL|LVNI_SELECTED);
if(nItem >= 0)
ListView_EnsureVisible(m_hListView, nItem, FALSE);
//旕昞帵
ShowWindow(m_hListView, SW_SHOW);
SetFocus(m_hListView);
}
///////////////////////////////////////////////////////////////
void CAssociation::LoadAppList2()
{
//旕昞帵
ShowWindow(m_hListView2, SW_HIDE);
//儕僗僩偺嶍彍
ListView_DeleteAllItems(m_hListView2);
//僀儊乕僕儕僗僩嶌惉
InitAppImageList(m_hListView2);
APPLICATIONLIST *lpList = m_lpAppList;
for(int i=0; lpList; i++)
{
//傾僀僥儉偺捛壛
LVITEM lvitem;
lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
lvitem.iItem = i;
lvitem.iSubItem = 0;
lvitem.iImage = lpList->nImageIndex;
lvitem.lParam = (DWORD)lpList;
lvitem.pszText = lpList->lpszExt;
int nIndex = ListView_InsertItem(m_hListView2, &lvitem);
ListView_SetItemText(m_hListView2, nIndex, 1, lpList->lpszAppName);
lpList = lpList->lpNext;
}//End of for
//旕昞帵
ShowWindow(m_hListView2, SW_SHOW);
SetFocus(m_hListView2);
}
///////////////////////////////////////////////////////////////
APPLICATIONLIST *CAssociation::GetSelectItem(HWND hList, int nSubItem, int nType)
{
//慖戰傾僀僥儉傪専嶕
int nItem = ListView_GetNextItem(hList, -1, LVNI_ALL|LVNI_SELECTED);
if(nItem == -1)
return NULL;
//傾僀僥儉庢摼
TCHAR szBuf[MAX_PATH];
ListView_GetItemText(hList, nItem, nSubItem, szBuf, sizeof(szBuf));
//傾僾儕働乕僔儑儞慖戰
nItem = -1;
APPLICATIONLIST *lpList = m_lpAppList;
for(int i=0; lpList; i++)
{
if(nType == FINDTYPE_APPNAME &&
0==wcscmp(szBuf, lpList->lpszAppName))
{
nItem = i;
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -