C++ 添加程序图标到我的电脑
生活随笔
收集整理的這篇文章主要介紹了
C++ 添加程序图标到我的电脑
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C++ 像我的電腦中 百度網(wǎng)盤的 那圖標(biāo)快捷方式。如何生成的呢?設(shè)置程序圖標(biāo)到我的電腦 請看下邊代碼 就ok了(*^__^*) 嘻嘻……
類似下圖:
?
大家如果看我下邊的不是很清楚,可以下載這個具體工程;
這里是我編譯的和一個測試Demo:http://pan.baidu.com/s/1dDBYJux
QQ群:103197177?C++進階討論;歡迎喜歡編程朋友加入進來一起討論學(xué)習(xí);
?
注意:在WIN7及以上的系統(tǒng)中,請以官員權(quán)限運行代碼;
函數(shù)說明:
SetProgramToNameSpace:設(shè)置程序圖標(biāo)到我的電腦?DelSubKey: 取消設(shè)置,刪除程序圖標(biāo)
?
#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\\")// 設(shè)置圖標(biāo)到我的電腦// lpszProPath省略 默認(rèn)給本程序添加圖標(biāo)到我的電腦,否則給指定程序添加圖標(biāo)到我的電腦 BOOL SetProgramToNameSpace(LPCTSTR lpszKeyName, LPCTSTR lpszGUID, LPCTSTR lpszProPath = NULL);// 創(chuàng)建注冊表項 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 << "在我的電腦 中創(chuàng)建圖標(biāo)成功!" << std::endl;}else{std::cout << "在我的電腦 中創(chuàng)建圖標(biāo)失敗!" << std::endl;std::cout << "請以右鍵管理員權(quán)限運行!" << std::endl;}// 刪除鍵值項(用于清理我的電腦里邊的圖標(biāo))//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{// NameSpaceTCHAR szSubKey[MAX_PATH] = STRNAMESPACE;_stprintf_s(szSubKey, _T("%s%s"), STRNAMESPACE,lpszGUID);if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKey)){throw(_T("NameSpace:創(chuàng)建注冊表%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:創(chuàng)建注冊表%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:創(chuàng)建注冊表%s項失敗!\n"), lpszGUID);}// DefaultIconTCHAR 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:創(chuàng)建注冊表%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:創(chuàng)建注冊表%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:創(chuàng)建注冊表%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);}// 關(guān)閉注冊表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); }
?
轉(zhuǎn)載于:https://www.cnblogs.com/calm2012/p/3619500.html
總結(jié)
以上是生活随笔為你收集整理的C++ 添加程序图标到我的电脑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构视频教程 -《数据结构(邓俊辉)
- 下一篇: mysql触发器预约实例_Mysql触发