C++ 像個人電腦中 百度網盤的 那圖標快捷方式。如何生成的呢?設置程序圖標到個人電腦 請看下邊代碼 就ok了(*^__^*) 嘻嘻……ios
相似下圖:shell
你們若是看我下邊的不是很清楚,能夠下載這個具體工程;編程
這裏是我編譯的和一個測試Demo:http://pan.baidu.com/s/1dDBYJux
windows
QQ羣:103197177 C++進階討論;歡迎喜歡編程朋友加入進來一塊兒討論學習;函數
注意:在WIN7及以上的系統中,請以官員權限運行代碼;學習
函數說明:測試
SetProgramToNameSpace:設置程序圖標到個人電腦
DelSubKey: 取消設置,刪除程序圖標
#include <windows.h> #include <iostream> #include <tchar.h> #ifndef _TRACE #define _TRACE(__VA_ARGS__) OutputDebugString(__VA_ARGS__) #endif #define STRNAMESPACE _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\") #define STRCLSID _T("SOFTWARE\\Classes\\CLSID\\") // 設置圖標到個人電腦
// lpszProPath省略 默認給本程序添加圖標到個人電腦,不然給指定程序添加圖標到個人電腦
BOOL SetProgramToNameSpace(LPCTSTR lpszKeyName, LPCTSTR lpszGUID, LPCTSTR lpszProPath = NULL); // 建立註冊表項 BOOL CreateSubkey(HKEY hKey, LPCTSTR lpszSubkey, HKEY& hResult); // 寫入註冊表鍵值 BOOL WritRegValue(HKEY hKey, LPCTSTR lpszValue, DWORD dwType = REG_SZ); // 刪除註冊表項 BOOL DelRegKey(LPCTSTR lpszSubkey); // 刪除寫入的註冊表項 void DelSubKey(LPCTSTR lpszGUID); int main(void) { if (SetProgramToNameSpace(_T("測試"), _T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C7}"))) { std::cout << "在個人電腦 中建立圖標成功!" << std::endl; } else { std::cout << "在個人電腦 中建立圖標失敗!" << std::endl; std::cout << "請以右鍵管理員權限運行!" << std::endl; } // 刪除鍵值項(用於清理個人電腦裏邊的圖標) //DelSubKey(_T("{FE533112-C7ED-4EBB-8177-F32CC37AB8C7}")); system("pause"); return 0; } 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 WritRegValue(HKEY hKey, LPCTSTR lpszValue, DWORD dwType) { if (ERROR_SUCCESS != RegSetValueEx(hKey, NULL, 0, dwType, (BYTE*)lpszValue, sizeof(TCHAR)*(_tcsclen(lpszValue) + 2*sizeof(TCHAR)))) { _TRACE(_T("NameSpace:寫註冊表鍵值%s失敗!\n"), lpszKeyName); return FALSE; } return TRUE; } BOOL SetProgramToNameSpace(LPCTSTR lpszKeyName, LPCTSTR lpszGUID, LPCTSTR lpszProPath) { BOOL bSuccess = FALSE; HKEY hSubKey = NULL; HKEY hSubKeyCLSID = NULL; HKEY hSubKeyDef = NULL; HKEY hSubKeyShell = NULL; HKEY hSubKeyOpen = NULL; HKEY hSubKeyCommand = NULL; try { // NameSpace TCHAR szSubKey[MAX_PATH] = STRNAMESPACE; _stprintf_s(szSubKey, _T("%s%s"), STRNAMESPACE,lpszGUID); if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKey)) { throw(_T("NameSpace:建立註冊表%s項失敗!\n"), lpszGUID); } if (!WritRegValue(hSubKey, lpszKeyName)) { throw(_T("NameSpace:寫註冊表鍵值%s失敗!\n"), lpszKeyName); } // CLSID _stprintf_s(szSubKey, _T("%s%s"), STRCLSID,lpszGUID); if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyCLSID)) { throw(_T("CLSID:建立註冊表%s項失敗!\n"), lpszGUID); } if (!WritRegValue(hSubKeyCLSID, lpszKeyName)) { throw(_T("CLSID:寫註冊表%s項失敗!\n"), lpszGUID); } _stprintf_s(szSubKey, _T("%s%s\\DefaultIcon"), STRCLSID,lpszGUID); if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyDef)) { throw(_T("CLSID:建立註冊表%s項失敗!\n"), lpszGUID); } // DefaultIcon TCHAR szExePath[MAX_PATH] = { 0 }; if (!lpszProPath) { GetModuleFileName(NULL, szExePath, MAX_PATH); if (!WritRegValue(hSubKeyDef, szExePath)) { throw(_T("CLSID-DefaultIcon:寫註冊表%s項失敗!\n"), szExePath); } } else if (!WritRegValue(hSubKeyDef, lpszProPath)) { throw(_T("CLSID-DefaultIcon:寫註冊表%s項失敗!\n"), lpszProPath); } // shell _stprintf_s(szSubKey, _T("%s%s\\shell"), STRCLSID,lpszGUID); if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyShell)) { throw(_T("CLSID-shell:建立註冊表%s項失敗!\n"), _T("shell")); } // Open _stprintf_s(szSubKey, _T("%s%s\\shell\\Open"), STRCLSID,lpszGUID); if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyOpen)) { throw(_T("CLSID-Open:建立註冊表%s項失敗!\n"), _T("Open")); } // Command _stprintf_s(szSubKey, _T("%s%s\\shell\\Open\\Command"), STRCLSID,lpszGUID); if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyCommand)) { throw(_T("CLSID-Command:建立註冊表%s項失敗!\n"), _T("Command")); } if (!lpszProPath) { if (!WritRegValue(hSubKeyCommand, szExePath)) { throw(_T("CLSID-DefaultIcon:寫註冊表%s項失敗!\n"), szExePath); } } else if (!WritRegValue(hSubKeyCommand, lpszProPath)) { throw(_T("CLSID-DefaultIcon:寫註冊表%s項失敗!\n"), lpszProPath); } bSuccess = TRUE; } catch (TCHAR* pError) { _TRACE(pError); } // 關閉註冊表 if (hSubKey) RegCloseKey(hSubKey); if (hSubKeyCLSID) RegCloseKey(hSubKeyCLSID); if (hSubKeyDef) RegCloseKey(hSubKeyDef); if (hSubKeyShell) RegCloseKey(hSubKeyShell); if (hSubKeyOpen) RegCloseKey(hSubKeyOpen); if (hSubKeyCommand) RegCloseKey(hSubKeyCommand); return bSuccess; } BOOL DelRegKey(LPCTSTR lpszSubkey) { HKEY hResult = NULL; if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubkey, 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hResult)) { if (ERROR_SUCCESS != RegDeleteKey(hResult, _T(""))) { _TRACE(_T("刪除%s項失敗\n"), lpszSubkey); } RegCloseKey(hResult); return TRUE; } return FALSE; } void DelSubKey(LPCTSTR lpszGUID) { TCHAR szSubKey[MAX_PATH] = {0}; _stprintf_s(szSubKey, _T("%s%s"), STRNAMESPACE,lpszGUID); DelRegKey(szSubKey); _stprintf_s(szSubKey, _T("%s%s\\DefaultIcon"), STRCLSID, lpszGUID); DelRegKey(szSubKey); _stprintf_s(szSubKey, _T("%s%s\\shell\\Open\\Command"), STRCLSID, lpszGUID); DelRegKey(szSubKey); _stprintf_s(szSubKey, _T("%s%s\\shell\\Open"), STRCLSID, lpszGUID); DelRegKey(szSubKey); _stprintf_s(szSubKey, _T("%s%s\\shell"), STRCLSID, lpszGUID); DelRegKey(szSubKey); }