📄 association.cpp
字号:
///////////////////////////////////////////////////////////////
//Association.cpp
//娭楢晅偗
///////////////////////////////////////////////////////////////
//INCLUDE
#include "GSFinder.h"
#include "Association.h"
///////////////////////////////////////////////////////////////
//僌儘乕僶儖曄悢
CAssociation *g_pChoose; //僾儘僌儔儉偺慖戰夋柺
CAssociation *g_pOption; //僆僾僔儑儞夋柺
///////////////////////////////////////////////////////////////
//僂傿儞僪僂僾儘僔乕僕儍(僾儘僌儔儉偺慖戰)
LRESULT CALLBACK ChooseProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
g_pChoose->m_hWnd = hDlg;
g_pChoose->m_hListView = GetDlgItem(hDlg, IDC_LIST_APP);
g_pChoose->OnInitChoose();
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
switch(wmId)
{
//OK儃僞儞墴壓
case IDOK:
g_pChoose->OnOKChoose();
EndDialog(hDlg, (INT)TRUE);
return TRUE;
//僉儍儞僙儖儃僞儞墴壓
case IDCANCEL:
EndDialog(hDlg, (INT)FALSE);
return TRUE;
//嶲徠儃僞儞墴壓
case IDC_BTN_BROWSE:
g_pChoose->OnBrowseChoose();
break;
}
break;
}
case WM_DESTROY:
g_pChoose->OnEndChoose();
break;
#ifdef __POCKET_PC
case WM_CTLCOLORSTATIC:
return DefDlgCtlColorStaticProc(hDlg, wParam, lParam);
#endif
}
return FALSE;
}
///////////////////////////////////////////////////////////////
//僂傿儞僪僂僾儘僔乕僕儍(僼傽僀儖偺庬椶僆僾僔儑儞)
LRESULT CALLBACK PPOptionFiletypeProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
g_pOption = new CAssociation(g_MainWnd.m_hWnd, g_hInst);
g_pOption->m_hWnd = hDlg;
g_pOption->m_hListView2 = GetDlgItem(hDlg, IDC_LIST_TYPE);
g_pOption->OnInitFiletype();
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
switch(wmId)
{
//怴婯儃僞儞墴壓
case IDC_BTN_NEW:
g_pOption->OpenNewFiletype();
g_pOption->OnClickFiletype();
break;
//嶍彍儃僞儞墴壓
case IDC_BTN_DEL:
g_pOption->OpenDeleteFiletype();
g_pOption->OnClickFiletype();
break;
//徻嵶愝掕儃僞儞墴壓
case IDC_BTN_DETAIL:
{
g_pOption->OpenDetailSetting();
g_pOption->OnClickFiletype();
break;
}
}
break;
}
case WM_NOTIFY:
{
LPNMHDR pNmHdr = (LPNMHDR)lParam;
switch (pNmHdr->code)
{
//僔儞僌儖僋儕僢僋
case NM_CLICK:
g_pOption->OnClickFiletype();
break;
//僟僽儖僋儕僢僋/塃僋儕僢僋
case NM_DBLCLK:
case NM_RCLICK:
g_pOption->OpenDetailSetting();
break;
//僇儔儉僋儕僢僋帪
case LVN_COLUMNCLICK:
g_pOption->OnColumnClick((LPNMLISTVIEW)lParam);
break;
}
break;
}
case WM_DESTROY:
g_pOption->OnEndFiletype();
delete g_pOption;
break;
#ifdef __POCKET_PC
//ADD START 僞僀僩儖壓偺慄捛壛丂by偐傢丅
case WM_PAINT:
return DefDlgPaintProc(hDlg, wParam, lParam);
//ADD END
case WM_CTLCOLORSTATIC:
return DefDlgCtlColorStaticProc(hDlg, wParam, lParam);
#endif
}
return FALSE;
}
///////////////////////////////////////////////////////////////
//僂傿儞僪僂僾儘僔乕僕儍(僼傽僀儖偺庬椶僆僾僔儑儞-怴婯)
LRESULT CALLBACK NewFiletypeProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
g_pOption->OnInitNewFiletype(hDlg);
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
switch(wmId)
{
//OK儃僞儞墴壓
case IDOK:
{
BOOL bRtn = g_pOption->OnOKNewFiletype(hDlg);
EndDialog(hDlg, (INT)bRtn);
return TRUE;
}
//僉儍儞僙儖儃僞儞墴壓
case IDCANCEL:
EndDialog(hDlg, (INT)FALSE);
return TRUE;
}
break;
}
case WM_DESTROY:
break;
}
return FALSE;
}
///////////////////////////////////////////////////////////////
//僂傿儞僪僂僾儘僔乕僕儍(僼傽僀儖偺庬椶僆僾僔儑儞-徻嵶愝掕)
LRESULT CALLBACK DetailFiletypeProc(
HWND hDlg,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
g_pOption->OnInitDetailSetting(hDlg);
break;
case WM_COMMAND:
{
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
switch(wmId)
{
//曄峏儃僞儞墴壓
case IDC_BTN_CHANGE:
g_pOption->OnChangeDetailSetting(hDlg);
break;
//OK儃僞儞墴壓
case IDOK:
{
BOOL bRtn = g_pOption->OnOKDetailSetting(hDlg);
if(bRtn) EndDialog(hDlg, (INT)TRUE);
return bRtn;
}
//僉儍儞僙儖儃僞儞墴壓
case IDCANCEL:
EndDialog(hDlg, (INT)FALSE);
return TRUE;
}
break;
}
case WM_DESTROY:
break;
}
return FALSE;
}
///////////////////////////////////////////////////////////////
int CALLBACK SortFileExt(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
APPLICATIONLIST* pList1 = (APPLICATIONLIST*)lParam1;
APPLICATIONLIST* pList2 = (APPLICATIONLIST*)lParam2;
BOOL bRaise = (BOOL)lParamSort;
return bRaise ? wcsicmp(pList1->lpszExt, pList2->lpszExt) : wcscmp(pList2->lpszExt, pList1->lpszExt);
}
///////////////////////////////////////////////////////////////
int CALLBACK SortAppName(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
APPLICATIONLIST* pList1 = (APPLICATIONLIST*)lParam1;
APPLICATIONLIST* pList2 = (APPLICATIONLIST*)lParam2;
BOOL bRaise = (BOOL)lParamSort;
return bRaise ? wcsicmp(pList1->lpszAppName, pList2->lpszAppName) : wcscmp(pList2->lpszAppName, pList1->lpszAppName);
}
///////////////////////////////////////////////////////////////
CAssociation::CAssociation(HWND hWnd, HINSTANCE hInst)
{
//儊儞僶曄悢弶婜壔
m_lpAppList = NULL;
m_hImageList = 0;
m_nbSortRaise = TRUE;
//僷儔儊乕僞偺曐懚
m_hparWnd = hWnd;
m_hInst = hInst;
}
///////////////////////////////////////////////////////////////
CAssociation::~CAssociation()
{
}
///////////////////////////////////////////////////////////////
void CAssociation::CreateAppList()
{
//慜夞嶌惉偟偨儕僗僩偺嶍彍
DeleteAppList();
HKEY hKey;
DWORD dwDisposition;
//儗僕僗僩儕乕僉乕偺僆乕僾儞
//HKEY_CLASSES_ROOT
if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_CLASSES_ROOT,_T(""),0,KEY_ALL_ACCESS, &hKey))
return;
BYTE* lpData = new BYTE[MAX_PATH];
APPLICATIONLIST *lpOldList = NULL;
for(int i=0; ;i++)
{
TCHAR szTemp[MAX_PATH];
TCHAR szSubKey[MAX_PATH];
TCHAR szAppName[MAX_PATH];
TCHAR szAppPath[MAX_PATH];
TCHAR szCommand[MAX_PATH];
DWORD dwType;
DWORD dwDataSize;
FILETIME ftime;
//僉乕偺庢摼
dwDataSize = sizeof(szSubKey);
if(ERROR_SUCCESS!=RegEnumKeyEx(hKey, i, szSubKey, &dwDataSize, NULL, NULL, NULL, &ftime))
break;
HKEY hKeyWk = 0;
//僉乕偑奼挘巕偺応崌
if(szSubKey[0]==_T('.'))
{
//堦抳偟側偄応崌偼柍帇
if(0!=wcsicmp(szSubKey, m_lpszExt)) continue;
//娭楢晅偗傾僾儕働乕僔儑儞(庬椶)庢摼
//HKEY_CLASSES_ROOT-奼挘巕-(嬻敀)
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(m_szExtType);
if (ERROR_SUCCESS!=RegQueryValueEx(hKeyWk, _T(""), 0, &dwType, lpData, &dwDataSize))
{
RegCloseKey(hKeyWk);
continue;
}
RegCloseKey(hKeyWk);
memset(m_szExtType, 0x00, sizeof(m_szExtType));
memcpy(m_szExtType, lpData, dwDataSize);
}
//僉乕抣偺庢摼
TCHAR szBuf[MAX_PATH];
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);
//搊榐敾掕
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(GetFileAttributes(szAppPath) == 0xFFFFFFFF)
continue;
//庢摼僨乕僞奿擺
APPLICATIONLIST *lpList = new APPLICATIONLIST;
//1.奼挘巕
lpList->lpszExt = NULL;
//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->nImageIndex = 0;
//7.師儗僐乕僪億僀儞僞
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::CreateAppList2()
{
//慜夞嶌惉偟偨儕僗僩偺嶍彍
DeleteAppList();
HKEY hKey;
DWORD dwDisposition;
//儗僕僗僩儕乕僉乕偺僆乕僾儞
//HKEY_CLASSES_ROOT
if(ERROR_SUCCESS!=RegOpenKeyEx(HKEY_CLASSES_ROOT,_T(""),0,KEY_ALL_ACCESS, &hKey))
return;
BYTE* lpData = new BYTE[MAX_PATH];
APPLICATIONLIST *lpOldList = NULL;
for(int i=0; ;i++)
{
TCHAR szTemp[MAX_PATH];
TCHAR szSubKey[MAX_PATH];
TCHAR szExt[MAX_PATH];
TCHAR szAppName[MAX_PATH];
TCHAR szAppPath[MAX_PATH];
TCHAR szCommand[MAX_PATH];
TCHAR szIconPath[MAX_PATH];
DWORD dwType;
DWORD dwDataSize;
int nIconID;
FILETIME ftime;
//僉乕偺庢摼
dwDataSize = sizeof(szSubKey);
if(ERROR_SUCCESS!=RegEnumKeyEx(hKey, i, szSubKey, &dwDataSize, NULL, NULL, NULL, &ftime))
break;
//僉乕偑奼挘巕埲奜偺応崌偼柍帇
if(szSubKey[0]!=_T('.')) continue;
HKEY hKeyWk = 0;
//娭楢晅偗傾僾儕働乕僔儑儞(庬椶)庢摼
//HKEY_CLASSES_ROOT-奼挘巕-(嬻敀)
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(szSubKey);
if (ERROR_SUCCESS!=RegQueryValueEx(hKeyWk, _T(""), 0, &dwType, lpData, &dwDataSize))
{
RegCloseKey(hKeyWk);
continue;
}
RegCloseKey(hKeyWk);
memset(szExt, 0x00, sizeof(szExt));
wcscpy(szExt, szSubKey);
memset(szSubKey, 0x00, sizeof(szSubKey));
memcpy(szSubKey, lpData, dwDataSize);
//僉乕抣偺庢摼
TCHAR szBuf[MAX_PATH];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -