C++ 添加程序图标到我的电脑

C++ 像我的电脑中 百度网盘的 那图标快捷方式。如何生成的呢?设置程序图标到我的电脑 请看下边代码 就ok了(*^__^*) 嘻嘻……

类似下图:

 

大家如果看我下边的不是很清楚,可以下载这个具体工程;

这里是我编译的和一个测试Demo:http://pan.baidu.com/s/1dDBYJux

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{// NameSpaceTCHAR 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);}// 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:创建注册表%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);
}

 

转载于:https://www.cnblogs.com/calm2012/p/3619500.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1663. 具有给定数值的最小字符串(贪心)

文章目录1. 题目2. 解题1. 题目 小写字符 的 数值 是它在字母表中的位置&#xff08;从 1 开始&#xff09;&#xff0c;因此 a 的数值为 1 &#xff0c;b 的数值为 2 &#xff0c;c 的数值为 3 &#xff0c;以此类推。 字符串由若干小写字符组成&#xff0c;字符串的数值 为…

LeetCode 1664. 生成平衡数组的方案数(前缀和+后缀和)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 。你需要选择 恰好 一个下标&#xff08;下标从 0 开始&#xff09;并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。 比方说&#xff0c;如果 nums [6,1,7,4,1] &#xff0c; 那么&#xff1a; …

迪美特TVZ8双核智能高清播放器 在电视上编程不是梦

迪美特TVZ8双核智能高清播放器 两步让普通电视变云电视 独家VST&#xff1a; 全网聚合&#xff0c;极致体验&#xff1a;独家自主设计&#xff0c;炫丽生动的Win8风格UI界面&#xff1a; 新版VST全聚合是华人用户数最多的聚合平台软件&#xff0c;集合视频点播、网络直播…

LeetCode 1665. 完成所有任务的最少初始能量(贪心)

文章目录1. 题目2. 解题1. 题目 给你一个任务数组 tasks &#xff0c;其中 tasks[i] [actuali, minimumi] &#xff1a; actuali 是完成第 i 个任务 需要耗费 的实际能量。minimumi 是开始第 i 个任务前需要达到的最低能量。 比方说&#xff0c;如果任务为 [10, 12] 且你当…

词云(WordCloud)制作

以《神雕侠侣》为例&#xff0c;我们制作词云&#xff0c;看看有哪些高频词汇。 1. 导入一些包 # -*- coding:utf-8 -*- # Python Version: 3.7 # Time: 2020/11/27 19:32 # Author: Michael Ming # Website: https://michael.blog.csdn.net/ # File: word_cloud.py # Refere…

天池 在线编程 求和查找

文章目录1. 题目2. 解题1. 题目 来源&#xff1a;https://tianchi.aliyun.com/oj/164427478262600292/204998627646706400 2. 解题 暴力 哈希查找 class Solution { public:/*** param inputs: an integer array* param tests: an integer array* return: return true if s…

天池 在线编程 条件串(DP)

文章目录1. 题目2. 解题1. 题目 来源&#xff1a;https://tianchi.aliyun.com/oj/164427478262600292/204998627646706401 2. 解题 把字符串分成ace&#xff0c;bdf 两部分进行处理&#xff0c;求以某个字符结束时的最小删除次数 class Solution { public:/*** param s: wri…

用 Kaggle 经典案例教你用 CNN 做图像分类!

我们来看一个 Kaggle 上比较经典的一个图像分类的比赛 CIFAR( CIFAR-10 - Object Recognition in Images )&#xff0c;这个比赛现在已经关闭了&#xff0c;但不妨碍我们来去通过它学习一下卷积神经网络做图像识别的代码结构。相信很多学过深度学习的同学都尝试过这个比赛&…

Flask知识点回顾以及重点内容

1. HTTP通信与Web框架 1.1 流程 客户端将请求打包成HTTP的请求报文&#xff08;HTTP协议格式的请求数据&#xff09; 采用TCP传输发送给服务器端 服务器接收到请求报文后按照HTTP协议进行解析 服务器根据解析后获知的客户端请求进行逻辑执行 服务器将执行后的结果封装成HTTP的响…

机器学习回归算法—线性回归及案例分析

一、回归算法回归是统计学中最有力的工具之一。机器学习监督学习算法分为分类算法和回归算法两种&#xff0c;其实就是根据类别标签分布类型为离散型、连续性而定义的。回归算法用于连续型分布预测&#xff0c;针对的是数值型的样本&#xff0c;使用回归&#xff0c;可以在给定…

LeetCode 1669. 合并两个链表

文章目录1. 题目2. 解题1. 题目 给你两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。 请你将 list1 中第 a 个节点到第 b 个节点删除&#xff0c;并将list2 接在被删除节点的位置。 下图中蓝色边和节点展示了操作后的结果&#xff1a; 请你返回结果…

机器学习回归算法—性能评估欠拟合与过拟合

机器学习中的泛化&#xff0c;泛化即是&#xff0c;模型学习到的概念在它处于学习的过程中时模型没有遇见过的样本时候的表现。在机器学习领域中&#xff0c;当我们讨论一个机器学习模型学习和泛化的好坏时&#xff0c;我们通常使用术语&#xff1a;过拟合和欠拟合。我们知道模…

Nginx安全配置

nginx本身不能处理PHP&#xff0c;它只是个web服务器&#xff0c;当接收到请求后&#xff0c;如果是php请求&#xff0c;则发给php解释器处理&#xff0c;并把结果返回给客户端。nginx一般是把请求发fastcgi管理进程处理&#xff0c;fastcgi管理进程选择cgi子进程处理结果并返回…

LeetCode 1670. 设计前中后队列(deque)

文章目录1. 题目2. 解题1. 题目 请你设计一个队列&#xff0c;支持在前&#xff0c;中&#xff0c;后三个位置的 push 和 pop 操作。 请你完成 FrontMiddleBack 类&#xff1a; FrontMiddleBack() 初始化队列。 void pushFront(int val) 将 val 添加到队列的 最前面 。 void…

java 1.7 新特性

1.对Java集合&#xff08;Collections&#xff09;的增强支持 在JDK1.7之前的版本中&#xff0c;Java集合容器中存取元素的形式如下&#xff1a; 以List、Set、Map集合容器为例&#xff1a; 在JDK1.7中&#xff0c;摒弃了Java集合接口的实现类&#xff0c;如&#xff1a;ArrayL…

LeetCode 1671. 得到山形数组的最少删除次数(最长上升子序DP nlogn)

文章目录1. 题目2. 解题2.1 n^2 解法2.2 nlogn 解法197 / 1891&#xff0c;前10.4%435 / 6154&#xff0c;前7.07%前三题如下&#xff1a; LeetCode 5557. 最大重复子字符串 LeetCode 5558. 合并两个链表 LeetCode 5560. 设计前中后队列&#xff08;deque&#xff09; 1. 题目…

机器学习Tensorflow基础知识、张量与变量

TensorFlow是一个采用数据流图&#xff08;data flow graphs&#xff09;&#xff0c;用于数值计算的开源软件库。节点&#xff08;Nodes&#xff09;在图中表示数学操作&#xff0c;图中的线&#xff08;edges&#xff09;则表示在节点间相互联系的多维数据数组&#xff0c;即…

LeetCode 1672. 最富有客户的资产总量

文章目录1. 题目2. 解题1. 题目 给你一个 m x n 的整数网格 accounts &#xff0c;其中 accounts[i][j] 是第 i​​​​​​​​​​​​ 位客户在第 j 家银行托管的资产数量。 返回最富有客户所拥有的 资产总量 。 客户的 资产总量 就是他们在各家银行托管的资产数量之和。最…

机器学习Tensorflow基本操作:线程队列图像

一、线程和队列在使用TensorFlow进行异步计算时&#xff0c;队列是一种强大的机制。为了感受一下队列&#xff0c;让我们来看一个简单的例子。我们先创建一个“先入先出”的队列&#xff08;FIFOQueue&#xff09;&#xff0c;并将其内部所有元素初始化为零。然后&#xff0c;我…

关于使用ModelSim中编写testbench模板问题

对于初学者来说写Testbench测试文件还是比较困难的&#xff0c;但Modelsim和quartus ii都提供了模板&#xff0c;下面就如何使用Modelsim提供的模板进行操作。 Modelsim提供了很多Testbench模板&#xff0c;我们直接拿过来用可以减少工作量。对源文件编译完后&#xff0c;鼠标光…