zoukankan      html  css  js  c++  java
  • c++怎样给文件右键菜单添加一项!给桌面文件右键添加菜单项

    #include <Windows.h>
    #include <iostream>
    #include <string>
    using namespace std;
     
    void add(string strMenuText, string strApplication);
    void del(string strMenuText);
     
    int main(){
        system("pause");
        return 0;
    }
     
    void add(string strMenuText, string strApplication){
        //添加右键菜单项"加密该文件"
        HKEY hresult;  
        long value;
        //string strRegKeyName = "我的加密";
        string strRegKeyName = strMenuText;
        string strRegKey = "*\shell\" + strRegKeyName;//if txt file, please use "txtfile\shell\用我的文本编辑程序打开"
        string strRegSubkey="*\shell\" + strRegKeyName + "\command";
        //string strMenuText="加密该文件"; 
        //string strApplication="E:\Desktop\Use\xsearch_CHS.exe %1";
        strApplication = strApplication + " %1";
     
        DWORD dwPos;  
        //创建“加密”子键,并设置右键菜单项的名称
        value=RegCreateKeyEx(HKEY_CLASSES_ROOT,(LPSTR)(LPCSTR)strRegKey.c_str(),0,NULL,REG_OPTION_NON_VOLATILE,KEY_CREATE_SUB_KEY|KEY_ALL_ACCESS,NULL,&hresult,&dwPos);
        value=RegSetValueEx(hresult,NULL,0,REG_SZ,(BYTE*)(LPCTSTR)strMenuText.c_str(), strMenuText.length()); 
        
        //创建“command”子键,并设置关联的应用程序
        value=RegCreateKeyEx(HKEY_CLASSES_ROOT,(LPSTR)(LPCSTR)strRegSubkey.c_str(),0,NULL,REG_OPTION_NON_VOLATILE,KEY_CREATE_SUB_KEY|KEY_ALL_ACCESS,NULL,&hresult,&dwPos);
        value=RegSetValueEx(hresult,NULL,0,REG_SZ,(const BYTE*)(LPCTSTR)strApplication.c_str(),strApplication.length());
     
        //关闭注册表
        ::RegCloseKey(hresult);
    }
     
    void del(string strMenuText){
        HKEY hKey;
        //string strRegKeyName = "我的加密";
        string strRegKeyName = strMenuText;
        string strRegKey="*\shell\" + strRegKeyName;  
        string strRegSubkey="*\shell";  
        
        //打开父键
        long lRet=::RegOpenKeyEx(HKEY_CLASSES_ROOT,(LPSTR)(LPCSTR)strRegKey.c_str(),0,KEY_READ,&hKey);  
        
        //删除“command”子键  
        ::RegDeleteKey(hKey,LPCTSTR("command"));  
        ::RegCloseKey(hKey);  
        
        lRet=::RegOpenKeyEx(HKEY_CLASSES_ROOT,(LPSTR)(LPCSTR)strRegSubkey.c_str(),0,KEY_READ,&hKey);
        
        //删除“加密”子键  
        ::RegDeleteKey(hKey,LPCTSTR(strRegKeyName.c_str()));  
        ::RegCloseKey(hKey);
    }

    下面是一个比较完整的例子:

    #include <Windows.h>
    #include <iostream>
    #include <string>
    #include "CommDlg.h"
     
    using namespace std;
     
    bool add(string strMenuText, string strApplication);
    bool del(string strMenuText);
    string openDlg();
     
    int main(){
        while(true){
            cin.clear();
            cin.sync();
            int m = 0;
            cout << "(1)添加桌面菜单项 (2)删除桌面菜单项 (3)退出:";
            cin >> m;
     
            if(m == 1){
                std::string name, path;
                cout << "请输入菜单名:";
                cin.clear();
                cin.sync();
                getline(cin,name);
                cout << "输入程序路径:";
                cin.clear();
                cin.sync();
                //getline(cin, path);
                path = openDlg();
                if(!add(name, path)){
                    cout << "添加失败!请以管理员身份运行" << endl;
                }else{
                    cout << "添加完成!右键点击任意文件看看" << endl;
                }
            }
            if(m == 2){
                std::string name;
                cout << "请输入菜单名:";
                cin.clear();
                cin.sync();
                cin >> name;
                if(!del(name)){
                    cout << "删除失败!请以管理员身份运行" << endl;
                }else{
                    cout << "删除成功!" << endl;
                }
            }
            if(m == 3){
                return 0;
            }
        }
        system("pause");
        return 0;
    }
    string openDlg(){
    TCHAR szBuffer[MAX_PATH] = {0};   
    OPENFILENAME ofn= {0};   
    ofn.lStructSize = sizeof(ofn);   
    ofn.hwndOwner = NULL;   
    ofn.lpstrFilter = ("Exe文件(*.exe)*.exe所有文件(*.*)*.*");//要选择的文件后缀   
    ofn.lpstrInitialDir =  ("C:\Program Files");//默认的文件路径   
    ofn.lpstrFile = szBuffer;//存放文件的缓冲区   
    ofn.nMaxFile = sizeof(szBuffer)/sizeof(*szBuffer);   
    ofn.nFilterIndex = 0;   
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_EXPLORER ;//标志如果是多选要加上OFN_ALLOWMULTISELECT  
    BOOL bSel = GetOpenFileName(&ofn);   
    return szBuffer;
    }
    bool add(string strMenuText, string strApplication){
        //添加右键菜单项"加密该文件"
        HKEY hresult;  
        long value;
        //string strRegKeyName = "我的加密";
        string strRegKeyName = strMenuText;
        string strRegKey = "*\shell\" + strRegKeyName;//if txt file, please use "txtfile\shell\用我的文本编辑程序打开"
        string strRegSubkey="*\shell\" + strRegKeyName + "\command";
        //string strMenuText="加密该文件"; 
        //string strApplication="E:\Desktop\Use\xsearch_CHS.exe %1";
        strApplication = strApplication + " %1";
        DWORD dwPos;  
        //创建“加密”子键,并设置右键菜单项的名称
        value=RegCreateKeyEx(HKEY_CLASSES_ROOT,(LPSTR)(LPCSTR)strRegKey.c_str(),0,NULL,REG_OPTION_NON_VOLATILE,KEY_CREATE_SUB_KEY|KEY_ALL_ACCESS,NULL,&hresult,&dwPos);
        if(0 != value){
            return false;
        }
        
        value=RegSetValueEx(hresult,NULL,0,REG_SZ,(BYTE*)(LPCTSTR)strMenuText.c_str(), strMenuText.length()); 
            if(0 != value){
            return false;
        }
        //创建“command”子键,并设置关联的应用程序
        value=RegCreateKeyEx(HKEY_CLASSES_ROOT,(LPSTR)(LPCSTR)strRegSubkey.c_str(),0,NULL,REG_OPTION_NON_VOLATILE,KEY_CREATE_SUB_KEY|KEY_ALL_ACCESS,NULL,&hresult,&dwPos);
        if(0 != value){
            return false;
        }
        
        value=RegSetValueEx(hresult,NULL,0,REG_SZ,(const BYTE*)(LPCTSTR)strApplication.c_str(),strApplication.length());
        if(0 != value){
            return false;
        }
        //关闭注册表
        ::RegCloseKey(hresult);
    }
    bool del(string strMenuText){
        HKEY hKey;
        //string strRegKeyName = "我的加密";
        string strRegKeyName = strMenuText;
        string strRegKey="*\shell\" + strRegKeyName;  
        string strRegSubkey="*\shell";  
        
        //打开父键
        long lRet=::RegOpenKeyEx(HKEY_CLASSES_ROOT,(LPSTR)(LPCSTR)strRegKey.c_str(),0,KEY_READ,&hKey);  
        if(0 != lRet){
            return false;
        }
        //删除“command”子键  
        lRet = ::RegDeleteKey(hKey,LPCTSTR("command"));  
        if(0 != lRet){
            return false;
        }
        ::RegCloseKey(hKey);  
        
        lRet=::RegOpenKeyEx(HKEY_CLASSES_ROOT,(LPSTR)(LPCSTR)strRegSubkey.c_str(),0,KEY_READ,&hKey);
        if(0 != lRet){
            return false;
        }
        //删除“加密”子键  
        lRet = ::RegDeleteKey(hKey,LPCTSTR(strRegKeyName.c_str()));  
        if(0 != lRet){
            return false;
        }
        ::RegCloseKey(hKey);
    }
  • 相关阅读:
    Java反射之访问私有属性或方法
    java字符串中显示双引号
    什么导致spring事务失效
    ActiveMq性能优化
    JFrame关闭事件处理
    c3p0数据库连接池死锁问题
    Mongodb性能优化
    Spring事务配置的五种方式
    ActiveMq启动停止
    JScrollPane动态加载图片
  • 原文地址:https://www.cnblogs.com/jasonxiaoqinde/p/11821569.html
Copyright © 2011-2022 走看看