重建表徵圖緩衝

來源:互聯網
上載者:User
有時候Windows會出現表徵圖顯示錯亂的問題,比如張冠李戴,該顯示這個表徵圖的顯示了別的檔案表徵圖,或者是表徵圖顯示一團黑或者是表徵圖空白,這很有可能是 Windows的表徵圖緩衝受到破壞所致。(至於Windows為何設定表徵圖緩衝,我想可能是出於效能考慮,因為如果顯示表徵圖的時候再去到每個檔案裡面去找表徵圖會不會太慢了呢)
如果Windows 表徵圖顯示錯亂,用一些常用軟體比如Windows最佳化大師的【重建表徵圖緩衝】功能就可以使表徵圖恢複正常,那麼這個功能是如何編程實現的呢?
有一種說法是:刪除C:/Documents and Settings/使用者名稱/Local Settings/Application Data/IconCache.db 檔案。但是這個方法需要重新啟動系統才可生效。其實有更好的方法,不需要重新啟動系統就可生效。我在 http://www.codeproject.com/KB/winsdk/nsetfoldericons.aspx找到了答案。請注意這篇文章中的refreshicons()函數:

void CShellIconChangerDlg::RefreshIcons()
{
    CString val;
    HKEY hKey;

    LONG result = ::RegOpenKeyEx(HKEY_CURRENT_USER,
        "Control Panel//Desktop//WindowMetrics",
        0,KEY_READ,&hKey);
    BYTE buff[256];
    ZeroMemory(buff,255);
    DWORD sz = sizeof buff;
    DWORD typ = REG_SZ;
    RegQueryValueEx(hKey,"Shell Icon Size",0,&typ,buff,&sz);
    RegCloseKey(hKey);

    val = buff;

    int i = atoi(val);
    i++;
    val.Format("%d",i);

    result = ::RegOpenKeyEx(HKEY_CURRENT_USER,
        "Control Panel//Desktop//WindowMetrics",
        0,KEY_WRITE,&hKey);
    RegSetValueEx(hKey,"Shell Icon Size",0,REG_SZ,
        (const BYTE*)val.GetBuffer(0),val.GetLength());
    val.ReleaseBuffer();
    RegCloseKey(hKey);

    ::SendMessage(HWND_BROADCAST ,
        WM_SETTINGCHANGE,SPI_SETNONCLIENTMETRICS,NULL);

    i = atoi(val);
    i--;
    val.Format("%d",i);

    result = ::RegOpenKeyEx(HKEY_CURRENT_USER,
        "Control Panel//Desktop//WindowMetrics",
        0,KEY_WRITE,&hKey);
    RegSetValueEx(hKey,"Shell Icon Size",0,REG_SZ,
        (const BYTE*)val.GetBuffer(0),val.GetLength());
    val.ReleaseBuffer();
    RegCloseKey(hKey);

    ::SendMessage(HWND_BROADCAST ,
        WM_SETTINGCHANGE,SPI_SETNONCLIENTMETRICS,NULL);
}

正是完成了重建表徵圖緩衝的操作。至於原理,看代碼是這個意思:先把windows表徵圖顯示大小增加了1,然後廣播一個 WM_SETTINGCHANGE 訊息,最後又把表徵圖大小改回了原來的值,在廣播一個 WM_SETTINGCHANGE訊息。

不過那個代碼是VC++的,我給小小的改造了一下,把CString 改為 wxString,現在用wxDev-C++可以編譯了,而且能夠成功的重新整理表徵圖緩衝,。改後的代碼如下:

#include "windows.h"
#include "wx.h"

void RefreshIcons()
{
    wxString val;
    HKEY hKey;

    LONG result = ::RegOpenKeyEx(HKEY_CURRENT_USER,
        "Control Panel//Desktop//WindowMetrics",
        0,KEY_READ,&hKey);
    BYTE buff[256];
    ZeroMemory(buff,255);
    DWORD sz = sizeof buff;
    DWORD typ = REG_SZ;
    RegQueryValueEx(hKey,"Shell Icon Size",0,&typ,buff,&sz);
    RegCloseKey(hKey);

    val = wxString::Format( "%s",buff);

    long i;
    val.ToLong(&i);
    i++;
    val=wxString::Format("%d",i);

    result = ::RegOpenKeyEx(HKEY_CURRENT_USER,
        "Control Panel//Desktop//WindowMetrics",
        0,KEY_WRITE,&hKey);

    //MessageBox(0,val.mb_str(),"",MB_OK);

    RegSetValueEx(hKey,"Shell Icon Size",0,REG_SZ,
        (const BYTE*)val.mb_str(),val.Length());

    RegCloseKey(hKey);

    ::SendMessage(HWND_BROADCAST ,
        WM_SETTINGCHANGE,SPI_SETNONCLIENTMETRICS,NULL);

    val.ToLong(&i);
    i--;
    val=wxString::Format("%d",i);

    result = ::RegOpenKeyEx(HKEY_CURRENT_USER,
        "Control Panel//Desktop//WindowMetrics",
        0,KEY_WRITE,&hKey);

    //MessageBox(0,val.mb_str(),"",MB_OK);

    RegSetValueEx(hKey,"Shell Icon Size",0,REG_SZ,
        (const BYTE*)val.mb_str(),val.Length());

    RegCloseKey(hKey);

    ::SendMessage(HWND_BROADCAST ,
        WM_SETTINGCHANGE,SPI_SETNONCLIENTMETRICS,NULL);
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.