آژانس هواپیماییexchanging

Rebuild Icon Cache

شروع موضوع توسط littlerabbit ‏24 سپتامبر 2003 در انجمن برنامه نویسی

  1. littlerabbit

    littlerabbit مدیر بازنشسته کاربر فعال

    تاریخ عضویت:
    ‏13 جولای 2003
    نوشته ها:
    667
    تشکر شده:
    4
    محل سکونت:
    Iran
    سلام
    شاید شما هم تا به حال به مشکل در هم ریختگی در آیکون های ویندوز برخورده باشید.و احتمالا میدانید که این در هم ریختگی از Icon Cache ویندوز ناشی میشود.این Icon Cache در حقیقت نوعی Data Base است که از آیکون تشکیل شده است و شامل کلیه ایکونهایی است که در چند وقت گذشته توسط ویندوز نمایش داده شده است.حالا برای نمایش آیکونهای جدید ویندوز به جای Load مجدد این ایکونها آنها را از Cach میخواند و این سرعت را بالا میبرد.
    این بالا بردن سرعت عواقبی دارد که یکی از آنها به هم ریختن گاه و بیگاه آیکونها است و یکی حجم نسبتا زیادی است که گاهی این Cache اشغال میکند.حالا راه حل MicroSoft برای حل این مشکل و اصطلاحا باز سازی Cache چیست؟ هیچ!! یکی حذف کردن فایل ShellIconCache در شاخه ویندوز است که نیاز به راه اندازی مجدد دارد (و در ویندوز 98 این فایل باید در حالت Safemode حذف شود) و یکی اینکه از طریق کنترل پانل و Display PropertiesAppearance اندازه آیکونها را یکی بالا ببرید تایید کنید و دوباره یکی پایین بیاورید این هم اصل راه حل :

    [left:19aeb759dd]PSS ID Number: 199152
    Article Last Modified on 8/10/2001

    The information in this article applies to:

    Microsoft Windows NT Workstation 4.0
    Microsoft Windows NT Server 4.0
    Microsoft Windows 95
    Microsoft Windows 98

    This article was previously published under Q199152
    SYMPTOMS
    The Windows desktop icons may not be correctly displayed on the desktop. In some cases, the icons may be displayed as black or possibly in other colors. Ultimately, the icons do not appear as advertised.

    Deleting and re-creating the shortcuts does not fix the problem. Newly created shortcuts are also affected by the problem. Non-shortcut icons such as My Computer, Recycle Bin, and folders are unaffected by this problem.
    CAUSE
    The reason that the icons are displayed incorrectly may be related to the use of TweakUI in conjunction with Internet Explorer 4.0. This occurs because of corruption in the Icon Cache file.
    RESOLUTION
    To ensure that the icons are displayed correctly, complete the following steps.

    Uninstall TweakUI from the system (if installed).
    Open Start Menu, Settings, Control Panel, then click the Display icon.
    Select the Appearance tab.
    Select the icon in the Item Box.
    Increase the icon unit by 1.
    Select Apply.
    Decrease the icon unit by 1.
    Select OK.


    Delete the file %systemroot%ShellIconCache Note: This file has a hidden attribute.
    Log off and log back on to see the correct icons.
    MORE INFORMATION
    The third-party products that are discussed in this article are manufactured by companies that are independent of Microsoft. Microsoft makes no warranty, implied or otherwise, regarding the performance or reliability of these products.
    Keywords: kbprb KB199152
    Technology: kbWin95search kbWin98 kbWin98search kbWinNT400search kbWinNTS400 kbWinNTS400search kbWinNTsearch kbWinNTSsearch kbWinNTW400 kbWinNTW400search kbWinNTWsearch kbZNotKeyword3 [/left:19aeb759dd]

    به عبارتی این امکان از طریق یک برنامه وجود ندارد (چونکه هیچ راهی برای تغییر انداره آیکونها به صورت یک تابع در اختیار برنامه نویس نیست.البته میشود اندازه استاندارد آن را از طریق تابع GetSystemMetrics گرفت) به هر حال اینجا من یک حقه کوچک پیدا کرده ام که اجازه میدهد اینکار را از طریق برنامه انجام بدهیم.(این برای برنامه نویسان Shell که قصد ثبت نوع فایل دارند خیلی بدرد بخور است.مخصوصا اینکه خیلی وقتها تابع SHChangeNotify درست عمل نمیکند و با اینکه اعلام میشود که نوع جدیدی ثبت شده و یا حذف شده همچنان آیکون درست نمایش داده نمیشود)
    راه حل ساده است برنامه را ببینید :

    [code:1]uses

       Registry,ShlObj;



    procedure RebuildIconCache;

    var

       X : String;

       T:Cardinal;

    begin

       with  TRegistry.Create do

       try

           RootKey:=HKEY_CURRENT_USER;

           OpenKey('Control PanelDesktopWindowMetrics',False);

           X:=ReadString('Shell Icon Size');

           if X='' then X:='32';

           WriteString('Shell Icon Size',IntToStr(StrToInt(X)+1));

           SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0,0,SMTO_NORMAL,1000,T);

           WriteString('Shell Icon Size',X);

           SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,0,0,SMTO_NORMAL,1000,T);

       finally

           Free;

       end;

    end;[/code:1]

    این تابع سایز آیکونها را یکی بالا میبرد (از طریق نوشتن در رجیستری) بعد به همه پنجره ها اعلام میکند که اندازه آیکونها تغییر کرده (به این عمل اصطلاحا BroadCast میگویند و به جای SendMessageTimeOut میشود از BroadCastSystemMessage هم استفاده کرد ولی این ساده تر است و آرگومانهای کمتری دارد) بعد دوباره آن را به حالت اول در آورده و سپس دوباره پیغام Setting Change را به همه پنجره ها میفرستد نتیجه را خودتان خیلی راحت میتوانید ببینید.

    تا بعد ....
    ( ;<[left:19aeb759dd][/left:19aeb759dd]