桌面清理工具

先看一下界面。

主界面如 :

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

接下来是配置不清理项:

 

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

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

如须程序代码,请留言。

 

 

 

 

 

 

 

 

 

posted @ 2012-10-22 23:46  夜雨無聲  阅读(2230)  评论(0编辑  收藏  举报