⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 association.cpp

📁 PocketPC上很好用的文件管理器,而且里面的封装性很好,学windows mobile开发的兄弟,值得一看
💻 CPP
📖 第 1 页 / 共 3 页
字号:
///////////////////////////////////////////////////////////////
//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 + -