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
{
// 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);
}
C++ 添加程序图标到我的电脑的更多相关文章
- Qt 添加程序图标和系统托盘图标
添加程序图标 第一种方法: 1.创建程序的时候,选择添加默认图标 2.替换程序目录下的ico文件,编译生成即可. 第二种方法: 比较适合一开始没有添加程序图标的情况 1.项目右键-->添加--& ...
- QT添加程序图标及窗口图标
程序图标 材料准备 图标文件:*.ico文件,存放在源文件同一目录下,如"myapp.ico" 写入图标 向*.pro文件中,独立一行写入"RC_ICONS = *.ic ...
- Linux 添加程序图标到开始菜单中
Linux平台的Ubuntu系统中,开始菜单中的程序都在/usr/share/applications/目录下,文件格式都是xxxx.desktop ========================= ...
- android如何添加桌面图标和卸载程序后自动删除图标
android如何添加桌面图标和卸载程序后自动删除桌面图标,这是一个应用的安装与卸载过程对桌面图标的操作,下面与大家分享下具体是如何实现的,感兴趣的朋友可以参考下哈 1:创建图标如下 Intent i ...
- 使用CodeBlocks为你的程序添加程序文件图标和启动读入图标
其实也非常简单,自己这两天用win32api做了一个小程序,可是发现图标却是dos的,太难看了,于是就想起以前学win32汇编时候用到的工具,ResEd,已经被我汉化了一些,估计有新的版本发布吧,但是 ...
- VB.net 2010下关联与程序图标设置
'*************************************************************************'**模 块 名:VB.net 2010下关联与程序 ...
- Qt应用程序图标设置
Qt应用程序图标设置 本文仅仅适用于windows下,linux等不适用. 下面说的图标,指的是程序文件的图标,而不是托盘图标或者说运行时任务栏的图标(任务栏和程序窗口的图标在windows/linu ...
- [转]简析 IOS 程序图标的设计
表现形态**** 在有限的空间里表达出相对应的信息,在IOS 程序图标设计中,直观是第一个解决的问题,不应该出现大多繁琐的修饰,当然还要有很好的视觉表现力,使用户可以更容易理解此应用的实际作用,更轻松 ...
- Innosetup打包自动下载.net framework 动态库及替换卸载程序图标.
在使用了一段时间微软自带的安装包打包工具后,总感觉不太顺利,于是便想着找一种更简单稳定的打包工具,这类工具其实还不少,最终经过各种考量,我们选择了 InnoSetup , 该工具是一个完全免费的Win ...
随机推荐
- SQL Server 2017 各版本之间的差异
SQL Server 2017的亮点 您选择的语言和平台 使用您选择的语言在本地和云中(现在在 Windows.Linux 和 Docker 容器上)构建现代应用程序. 行业领先的性能 充分利用任务关 ...
- 论文解读(ARVGA)《Learning Graph Embedding with Adversarial Training Methods》
论文信息 论文标题:Learning Graph Embedding with Adversarial Training Methods论文作者:Shirui Pan, Ruiqi Hu, Sai-f ...
- Win10 pycharm中显示PyTorch tensorboard图
import numpy import numpy as np import torch import matplotlib.pyplot as plt import torch.nn as nn i ...
- es6.4.2api
这是讲数据库的数据导入到es里 所有用到了mysql! 1.依赖 <?xml version="1.0" encoding="UTF-8"?> & ...
- ms08-067漏洞复现
一.环境说明 kali linux 靶机是 XP (xp启动445) 二.nmap扫描主机存在的漏洞 root@kali:~# nmap --script smb-vuln* 192.168.244. ...
- python之多进程and多线程
图文来自互联网 一.什么是进程和线程 (https://jq.qq.com/?_wv=1027&k=rX9CWKg4) 进程是分配资源的最小单位,线程是系统调度的最小单位. 当应用程序运行时最 ...
- Java已知图片路径下载图片到本地
public static void main(String[] args) { FileOutputStream fos = null; BufferedInputStream bis = null ...
- springboot的@ConditionalOnBean注解
上篇文章中分析了springboot的自动注入的原理,可在文章后面的推荐阅读中温习哦.在自动注入的原理那篇文章中提到了@ConditionalOnXX注解,今天来看下springboot中的@Co ...
- 强化学习-学习笔记5 | AlphaGo
本文不是论文阅读笔记,只是一个学习笔记,重在理解,在严谨程度上可能稍差. AlphaGo 论文指路: Mastering the game of Go with deep neural network ...
- C语言指针-小结
1) 指针变量可以进行加减运算,但是指针变量的加减运算并不是加上或减去一个数,而是跟指针指向的数据类型有关,数据类型在系统中占了多少个字节,指针+1后就向后移动了多少个字节. 2) int *poin ...