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++ 添加程序图标到我的电脑的更多相关文章

  1. Qt 添加程序图标和系统托盘图标

    添加程序图标 第一种方法: 1.创建程序的时候,选择添加默认图标 2.替换程序目录下的ico文件,编译生成即可. 第二种方法: 比较适合一开始没有添加程序图标的情况 1.项目右键-->添加--& ...

  2. QT添加程序图标及窗口图标

    程序图标 材料准备 图标文件:*.ico文件,存放在源文件同一目录下,如"myapp.ico" 写入图标 向*.pro文件中,独立一行写入"RC_ICONS = *.ic ...

  3. Linux 添加程序图标到开始菜单中

    Linux平台的Ubuntu系统中,开始菜单中的程序都在/usr/share/applications/目录下,文件格式都是xxxx.desktop ========================= ...

  4. android如何添加桌面图标和卸载程序后自动删除图标

    android如何添加桌面图标和卸载程序后自动删除桌面图标,这是一个应用的安装与卸载过程对桌面图标的操作,下面与大家分享下具体是如何实现的,感兴趣的朋友可以参考下哈 1:创建图标如下 Intent i ...

  5. 使用CodeBlocks为你的程序添加程序文件图标和启动读入图标

    其实也非常简单,自己这两天用win32api做了一个小程序,可是发现图标却是dos的,太难看了,于是就想起以前学win32汇编时候用到的工具,ResEd,已经被我汉化了一些,估计有新的版本发布吧,但是 ...

  6. VB.net 2010下关联与程序图标设置

    '*************************************************************************'**模 块 名:VB.net 2010下关联与程序 ...

  7. Qt应用程序图标设置

    Qt应用程序图标设置 本文仅仅适用于windows下,linux等不适用. 下面说的图标,指的是程序文件的图标,而不是托盘图标或者说运行时任务栏的图标(任务栏和程序窗口的图标在windows/linu ...

  8. [转]简析 IOS 程序图标的设计

    表现形态**** 在有限的空间里表达出相对应的信息,在IOS 程序图标设计中,直观是第一个解决的问题,不应该出现大多繁琐的修饰,当然还要有很好的视觉表现力,使用户可以更容易理解此应用的实际作用,更轻松 ...

  9. Innosetup打包自动下载.net framework 动态库及替换卸载程序图标.

    在使用了一段时间微软自带的安装包打包工具后,总感觉不太顺利,于是便想着找一种更简单稳定的打包工具,这类工具其实还不少,最终经过各种考量,我们选择了 InnoSetup , 该工具是一个完全免费的Win ...

随机推荐

  1. Django虚拟环境详解

    Django虚拟环境之 Virtualenv 1.安装 pip install virtualenv 2.创建虚拟环境 创建虚拟环境文件夹在当前目录 virtualenv [env_name] 3.激 ...

  2. Flink中如何实现一个自定义MetricReporter

    什么是 Metrics 在 flink 任务运行的过程中,用户通常想知道任务运行的一些基本指标,比如吞吐量.内存和 cpu 使用情况.checkpoint 稳定性等等.而通过 flink metric ...

  3. 花两万培训Java的三个同学,最后都怎么样了

    仙路尽头谁为峰,学完Java学Python. 前言 对于IT行业的培训,例如Java.大数据.H5等等,我一直保持着肯定的态度. 因为当年大学时期的我,也差点去参加Java培训.一是因为那时钱包空空, ...

  4. 关于python导入数据库excel数据时出现102, b"Incorrect syntax near '.15562'.DB-Lib error message 20018, severity 1的问题总结

    1.对于在使用python导入sqlsever时,出现102, b"Incorrect syntax near '.15562'.DB-Lib error message 20018, se ...

  5. vue-cli2.x配置build命令构建测试包&正式包

    项目开发中常分为开发环境.测试环境.正式环境 通过vue-cli或者@vue/cli脚手架搭建的项目默认提供了开发环境和正式环境的配置.可通过js获取当前域名或其他信息来判断当前为测试环境还是正式环境 ...

  6. Number.prototype.toString()方法

    Number.prototype.toString(radix)方法返回指定基数对应Number的字符串值 radix可选参数,值范围为2~36,转化基数,如果未指定,默认值为10,如果radix值不 ...

  7. SQL Server导出MDF数据库文件

    更新日志 2022年6月13日 发布. 2022年6月2日 开始. 一句话总结:先分离,然后复制. 先分离要导出mdf数据库文件的数据库. 在Microsoft SQL Server Manageme ...

  8. 离线环境使用NuGet

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年5月13日. 在Visual Studio中直接使用GUI的方式操作NuGet包非常的方便.如果喜欢命令行,也可以使用包管理控制台或者 ...

  9. BUUCTF-webshell后门

    webshell后门 老方法,D盾直接查杀. flag{ba8e6c6f35a53933b871480bb9a9545c}

  10. Moriis神级遍历!

    Moriis 遍历 Morris 遍历是二叉树遍历的一种方式,传统的递归和非递归遍历的时间复杂的都是O(N),空间复杂度都是O(h)(h为树的高度),而 Morris 遍历可以做到时间复杂的依然为 O ...