zoukankan      html  css  js  c++  java
  • 桌面清理工具

    先看一下界面。

    主界面如 :

     然后是被清理的桌面项的浏览:

    接下来是配置不清理项:

    本软件的主要工作原理是:

    1)配置不清理项。

    2)一键清理,被配置的不清理项不会被清理,会留在桌面上,其它文件会被移动到 ./DesktopFiles的目录下。

    3)快速查看被清理的桌面项,提供搜索功能。

    很简单。

    其中要处理的细节,代码贴如下:

    1.显示桌面时,程序界面不隐藏:

    View Code
    1)在 OnInitInstance ():
    CDesktopCleanDlg* pdlg = NULL;
        HWND hwnd = FindWindow (TEXT("Progman"), NULL);
        hwnd = ::GetWindow(hwnd, GW_CHILD);
        CWnd* pDesk = CWnd::FromHandle(hwnd);
        pdlg = new CDesktopCleanDlg (pDesk);
        pdlg->Create (CDesktopCleanDlg::IDD, pDesk);
    
        MSG msg;
        while (GetMessage (&msg, NULL, 0, 0)) {
            if (msg.message == WM_QUIT) {
                break;
            } else {
                TranslateMessage(&msg);
                DispatchMessage (&msg);
            }
        }
    
        pdlg->DestroyWindow();
        delete pdlg;
    采用非模态对话框进行构建。
    
    2)在MainDlg里设置定时器,定时器内如下处理:
    if (!m_pwndDesktopShow->IsWindowVisible()) // 
        ShowWindow(SW_SHOWNA);

    2.根据文件首字进行自动划分其实所属类别,如“我”-W,“你”-N,“2”-E等等。(转载)

    View Code
    string
    CFileManager::WhichClass (const char* pszName)
    {
        if (pszName == NULL) {
            return "";
        }
    
        static int li_SecPosValue[] = {
            1601, 1637, 1833, 2078, 2274, 2302, 2433, 2594, 2787, 3106, 3212,
            3472, 3635, 3722, 3730, 3858, 4027, 4086, 4390, 4558, 4684, 4925, 5249
        };
    
        static char* lc_FirstLetter[] = {
            "A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "O",
            "P", "Q", "R", "S", "T", "W", "X", "Y", "Z"
        };
    
        static char* ls_SecondSecTable =
            "CJWGNSPGCGNE[Y[BTYYZDXYKYGT[JNNJQMBSGZSCYJSYY[PGKBZGY[YWJKGKLJYWKPJQHY[W[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCK[PHFFSS[YBGXLPPBYLL[HLXS[ZM[JHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZC[J[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHY"
            "LYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY[JNDQJWXQXFYYFJLEJPZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLXQGJMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCLQKXLHXJRZJMFQHXHWY"
            "WSBHTRXXGLHQHFNM[YKLDYXZPYLGG[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHN[NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMY"
            "DJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYD[FCXYHLXCHYZJQ[[QAGMNYXPFRKSSBJLYXYSYGLNSCMHZWWMNZJJLXXHCHSY[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLY[DCCWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQH[PQ[QSCFYMNDMGBWHWLGSLLYSDLMLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZP"
            "MGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFHB[GDMYCNQQWLQHJJ[YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL[HTZKZJECXJCJNMFBY[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJX[YZGWKYPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJB"
            "PMLMSXLZJQQHZYJCZYDJWBMYKLDDPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZLCLGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTX"
            "YXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSBGBMMCJSSCLPQPDXCDYYKY[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC[DXXLHJHF[SXZQHFZMZCZTQCXZXRTTDJHNNYZQQMNQDMMG[YDXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGS"
            "QQDDJCMBKZFFXMKDMDSYYSZCMLJDSYNSBRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJ[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG[DJLSLYGKDZPZXJ"
            "YYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJY[CNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKAQHQHJGYKHEZNMSHRP[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMMMYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYYDYJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZK"
            "HHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQ"
            "FHBSAQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ";
    
        string result;
        int H, L, W;
        UINT i, stringlen = strlen(pszName);
        int j;
        for (i = 0; i < 1; i++) {
            H = (UCHAR) (pszName[i + 0]);
            L = (UCHAR) (pszName[i + 1]);
    
            if (H < 0xA1 || L < 0xA1) {
                result += pszName[i];
                continue;
            } else {
                W = (H - 160) * 100 + L - 160;
            }
    
            if (W > 1600 && W < 5590) {
                for (j = 22; j >= 0; j--) {
                    if (W >= li_SecPosValue[j]) {
                        result += lc_FirstLetter[j];
                        i ++;
                        break;
                    }
                }
    
                continue;
            } else {
                i++;
                W = (H - 160 - 56) * 94 + L - 161;
                if (W >= 0 && W <= 3007)
                    result += ls_SecondSecTable[W];
                else {
                    result += (char) H;
                    result += (char) L;
                }
            }
        }
    
        for (int i = 0; i < result.length(); ++i) {
            switch (result [i]) {
            case '1':
                result [i] = 'Y';
                break;
    
            case  '2':
                result [i] = 'E';
                break;
    
            case '3':
            case '4':
                result [i] = 'S';
                break;
    
            case '5':
                result [i] = 'W';
                break;
    
            case '0':
            case '6':
                result [i] = 'L';
                break;
    
            case '7':
                result [i] = 'Q';
                break;
    
            case '8':
                result [i] = 'B';
                break;
    
            case '9':
                result [i] = 'J';
                break;
    
            default:
                break;
            }
    
            result [i] = toupper(result [i]);
        }
    
    
        return result;
    }

    3.获取桌面文件,注意,桌面文件比较特别,它有可能存在有不同用户的桌面文件,故不能用获取桌面文件夹的方式进行FindFirstFile, FindNextFile 进行文件枚举,这里采用COM枚举的方式(转载):

    View Code
    TCHAR MyDir[_MAX_PATH];  
        SHGetSpecialFolderPath(this->GetSafeHwnd(),MyDir,CSIDL_DESKTOP,0);
    
        TCHAR szExcept1 [MAX_PATH];
        _stprintf (szExcept1, TEXT ("%s\\desktop.ini"), MyDir);
    
        m_lstCurr.SetImageList(&m_imgList, LVSIL_NORMAL);
    
        SHFILEINFO   sfi;
        HICON hIcon;
    
        HRESULT   hr; 
        hr=CoInitialize(NULL); 
        if   (SUCCEEDED(hr)) 
        { 
            IMalloc   *pMalloc; 
            IShellFolder   *pFolder; 
            IEnumIDList   *pEnumIDList; 
    
            hr=SHGetMalloc(&pMalloc); 
            hr=SHGetDesktopFolder(&pFolder); 
    
            LPITEMIDLIST   pIDList; 
    
            hr=pFolder->EnumObjects (NULL,SHCONTF_STORAGE, &pEnumIDList); 
    
            STRRET   strBuf; 
            LPTSTR   pszName; 
            HRESULT   hrEnd; 
            int i = 0;
            do 
            {
                hrEnd=pEnumIDList->Next(1,&pIDList,NULL); 
    
                hr=pFolder->GetDisplayNameOf(pIDList,SHGDN_FORPARSING,&strBuf); 
                hr=StrRetToStr(&strBuf,pIDList,&pszName); 
    
    
                if (_tcsicmp (pszName, szExcept1) != 0 && _tcsicmp (pszName, MyDir) != 0) {
                    TCHAR* pszFileName = _tcsrchr (pszName, TEXT ('\\'));
                    if (pszFileName == NULL) {
                        pMalloc->Free (pszName); 
                        pMalloc->Free (pIDList);
                        continue;
                    }
    
                    pszFileName += 1;
                    if (!PathIsDirectory (pszName))
                        SHGetFileInfo(pszName,0,&sfi,sizeof(sfi),SHGFI_ICON|SHGFI_LARGEICON|SHGFI_USEFILEATTRIBUTES);
                    else
                        SHGetFileInfo(pszName,0,&sfi,sizeof(sfi),SHGFI_ICON|SHGFI_LARGEICON|SHGFI_SYSICONINDEX);
    
                    hIcon = sfi.hIcon;
                    m_imgList.Add (hIcon);
    
                    //CString str (pszName);
                    CStringA strA (pszName);
                    char* pszText = new char [strA.GetLength() + 1];
                    strcpy(pszText, strA);
                    LVITEM item;
                    item.mask        = LVIF_IMAGE | LVIF_PARAM | LVIF_TEXT;
                    item.cchTextMax    = strA.GetLength() + 1;
                    item.lParam        = (LPARAM)pszText;
                    item.iItem        = i;
                    item.iSubItem    = 0;
                    item.pszText    = pszFileName;
                    item.iImage        = i;
                    m_lstCurr.InsertItem  (&item);
                    ++i;
                }
                pMalloc->Free (pszName); 
                pMalloc->Free (pIDList);
    
    
            }while(hrEnd == S_OK); 
    
            pEnumIDList->Release (); 
            pFolder->Release (); 
        } 
        CoUninitialize();

    4.定位文件(夹)位置,我有博客写了这个算法,现在再贴一次吧。

    View Code
    #ifndef    ExploreFileH
    #define    ExploreFileH
    
    #include <Windows.h>
    #include <Shlobj.h>
    
    #ifdef    UNICODE
    #define    ExploreFile    ExploreFileW
    #elif    _UNICODE
    #define    ExploreFile    ExploreFileW
    #else
    #define    ExploreFile    ExploreFileA
    #endif
    
    BOOL 
    ExploreFileW (const wchar_t* pwszFile)
    {
        LPITEMIDLIST    pidl;
        LPCITEMIDLIST    cpidl;
        IShellFolder*    pDesktopFolder;
    
        ULONG    ulEaten;
        DWORD    dwAttributes;
        HRESULT    hr;
        
        HKEY hKey;
        static wchar_t* s_pszSubKey = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion";
    
        if (pwszFile == NULL) {
            return FALSE;
        }
    
        ulEaten = wcslen (pwszFile);
    
        if (FAILED (SHGetDesktopFolder (&pDesktopFolder))) {
            return FALSE;
        }
    
        if (pwszFile [0] != L'{') {
            hr = pDesktopFolder->ParseDisplayName (
                NULL,
                0,
                (LPOLESTR)pwszFile,
                &ulEaten,
                &pidl,
                &dwAttributes);
        } else { // CLSID
            DWORD dwProductIdLen = 256;
            wchar_t szProductId [256] = {0};
            wchar_t szPathClsid [MAX_PATH] = {0};
            
            // 获取本机CLSID
            if (ERROR_SUCCESS != RegOpenKeyExW (HKEY_LOCAL_MACHINE,
                                                s_pszSubKey,
                                                0,
                                                KEY_READ,
                                                &hKey)) {
                pDesktopFolder->Release ();
                return FALSE;
            }
            
            DWORD dwType = REG_SZ;
            if (ERROR_SUCCESS != RegQueryValueExW (hKey,
                                                L"ProductId",
                                                0,
                                                &dwType,
                                                (LPBYTE)szProductId,
                                                &dwProductIdLen)) {
                pDesktopFolder->Release ();
                RegCloseKey (hKey);
                return FALSE;
            }
            
            RegCloseKey (hKey);
            wsprintfW (szPathClsid, L"{%s}}\\::%s", szProductId, pwszFile);
            
            hr = pDesktopFolder->ParseDisplayName (
                NULL,
                0,
                (LPOLESTR)szPathClsid,
                &ulEaten,
                &pidl,
                &dwAttributes);
        }
    
        if (FAILED (hr)) {
            pDesktopFolder->Release ();
            return FALSE;
        }
    
        cpidl = pidl;
    
    
        CoInitialize (NULL);
        if (FAILED (SHOpenFolderAndSelectItems (
            cpidl,
            0,
            NULL,
            NULL))) 
        {
            pDesktopFolder->Release ();
            CoUninitialize ();
            return FALSE;
        }
    
        pDesktopFolder->Release ();
        CoUninitialize ();
        return TRUE;
    }
    
    
    BOOL 
    ExploreFileA (const char* pszFile)
    {
        wchar_t wszFile [MAX_PATH + 1] = {0};
        if (!MultiByteToWideChar(
            CP_ACP, 
            MB_PRECOMPOSED, 
            pszFile, 
            -1,
            wszFile, 
            MAX_PATH))
        {
            return FALSE;
        }
    
        return ExploreFileW (wszFile);
    }
    
    
    
    #endif // ExploreFileH

    程序还有一些小BUG没有解决,如文件(夹)同名问题,它虽然不会覆盖,但我的程序无法区分。有时候配置不清理项时,会无法显示。后期再维护吧。

    程序下载地址:https://files.cnblogs.com/lin1270/desktop_true.zip

    如须程序代码,请留言。

  • 相关阅读:
    事件的解密
    C#世界中的委托
    这次是C#中的接口
    完全二叉树的建立和翻转
    全排列的应用
    网易笔试-按位或运算
    柱状图的最大矩形--单调栈
    Linux将线程绑定到CPU内核运行
    Windows多线程与线程绑定CPU内核
    B+树介绍
  • 原文地址:https://www.cnblogs.com/lin1270/p/2734754.html
Copyright © 2011-2022 走看看