zoukankan      html  css  js  c++  java
  • 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项失败!
    "), 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失败!
    "), 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项失败!
    "), lpszGUID);
            }
            if (!WritRegValue(hSubKey, lpszKeyName))
            {
                throw(_T("NameSpace:写注册表键值%s失败!
    "), lpszKeyName);
            }
    
    
            // CLSID
            _stprintf_s(szSubKey, _T("%s%s"), STRCLSID,lpszGUID);
            if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyCLSID))
            {
                throw(_T("CLSID:创建注册表%s项失败!
    "), lpszGUID);    
            }
            if (!WritRegValue(hSubKeyCLSID, lpszKeyName))
            {
                throw(_T("CLSID:写注册表%s项失败!
    "), lpszGUID);
            }
    
            _stprintf_s(szSubKey, _T("%s%s\DefaultIcon"), STRCLSID,lpszGUID);
            if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyDef))
            {
                throw(_T("CLSID:创建注册表%s项失败!
    "), lpszGUID);
            }
    
            // DefaultIcon
            TCHAR szExePath[MAX_PATH] = { 0 };
            if (!lpszProPath)
            {
                GetModuleFileName(NULL, szExePath, MAX_PATH);
                if (!WritRegValue(hSubKeyDef, szExePath))
                {
                    throw(_T("CLSID-DefaultIcon:写注册表%s项失败!
    "), szExePath);
                }
            }
            else if (!WritRegValue(hSubKeyDef, lpszProPath))
            {
                throw(_T("CLSID-DefaultIcon:写注册表%s项失败!
    "), lpszProPath);
            }
    
            // shell
            _stprintf_s(szSubKey, _T("%s%s\shell"), STRCLSID,lpszGUID);
            if (!CreateSubkey(HKEY_LOCAL_MACHINE, szSubKey, hSubKeyShell))
            {
                throw(_T("CLSID-shell:创建注册表%s项失败!
    "), _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项失败!
    "), _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项失败!
    "), _T("Command"));
            }
    
            if (!lpszProPath)
            {
                if (!WritRegValue(hSubKeyCommand, szExePath))
                {
                    throw(_T("CLSID-DefaultIcon:写注册表%s项失败!
    "), szExePath);
                }
            }
            else if (!WritRegValue(hSubKeyCommand, lpszProPath))
            {
                throw(_T("CLSID-DefaultIcon:写注册表%s项失败!
    "), 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项失败
    "), 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);
    }
  • 相关阅读:
    学习java第20天
    学习java第19天
    学习java第18天
    学习java第17天
    学习java第16天
    java架构师学习路线-Web分布式开发框架概述
    java架构师学习路线-并发编程的概念
    java架构师学习路线-Java系统中的微服务框架
    java架构师学习路线-HashMap的知识点总结归纳
    java架构师学习路线-Java并发编程的五种状态和两种创建方式
  • 原文地址:https://www.cnblogs.com/calm2012/p/3619500.html
Copyright © 2011-2022 走看看