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 ...
随机推荐
- 线程崩溃为什么不会导致 JVM 崩溃
大家好,我是坤哥 网上看到一个很有意思的据说是美团的面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题我看了不少回答,但都没答到根本原因,所以决定答一答,相信大家看完肯定会有收获,本文分以下几 ...
- 如何从0开发一个Vue组件库并发布到npm
1.新建文件夹在终端打开执行 npm init -y 生成package.json如下,注意如果要发布到npm,name不能有下划线,大写字母等 { "name": "v ...
- SQLite数据库损坏及其修复探究
数据库如何发生损坏 SQLite 数据库具有很强的抗损坏能力.在执行事务时如果发生应用程序崩溃.操作系统崩溃甚至电源故障,那么在下次访问数据库文件时,会自动回滚部分写入的事务.恢复过程是全自动的, ...
- 记ettercap0.8.3的DNS欺骗
无意间接触到这个叫中间人攻击,找了些教程自己搞了一遍. 局域网内测试,kali虚拟机桥接本地网络,不然不在一个段上面.kali 192.168.1.191 win10 :192.168.1.7 ett ...
- python小题目练习(四)
题目:JAVA和Python实现冒泡排序 实现代码: # Java实现对数组中的数字进行冒泡排序scoreList = [98, 87, 89, 90, 69, 50]temp = 0for i in ...
- NC235250 牛可乐的翻转游戏
NC235250 牛可乐的翻转游戏 题目 题目描述 牛可乐发明了一种新型的翻转游戏! 在一个有 \(n\) 行 \(m\) 列的棋盘上,每个格子摆放有一枚棋子,每一枚棋子的颜色要么是黑色,要么是白色. ...
- 虚拟机启动时报’A start job is running for /etc/rc.local .. Compatibility错误。
虚拟机启动时报'A start job is running for /etc/rc.local .. Compatibility错误. 问题已经存在很长时间了,但是不影响ssh登录,遂置之未理. 经 ...
- JSP页面+请求转发+EL表达式
1) JSP全称Java Server Pages,顾名思义就是运行在java服务器中的页面,也就是在我们JavaWeb中的动态页面,其本质就是一个Servlet.2) 其本身是一个动态网页技术标准, ...
- Lambda表达式的无参数无返回值的练习和Lambda表达式有参数有返回值的练习
使用Lambda(无参无返回) 说明:给定一个厨师(Cook)接口,内含唯一的抽象方法makeFood,且无参数.无返回值.如下: public interface Cook{ public abst ...
- Java方法的重写
package Demo.oop.APP.Demo04; //启动器 public class application { public static void main(String[] args) ...