PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : قدرت برنامه های خط دستوری را در ویندوز دست کم نگیرید - تغییر Desktop Wallpaper در خط دستور



آبجی
3rd April 2010, 02:47 PM
حتما قبل از مطالعه اين تاپيک،اين مطلب را مرور کنيد.

سلام
در اين تاپيک در نظر دارم که کمي به قابليت هاي برنامه نويسي در خط دستور در ويندوز بپردازم.معمولا افراد حرفه اي از قابليت shell لينوکس ،مطالب زيادي مي گويند.در اين بحث تاکيد من ويندوز است و تلاش می کنم برخي قابليت هاي ويندوز را که کمتر ما به آنها اهميت مي دهيم،بررسي کنم.البته در همين ابتدا بگويم (با اينکه من خيلي از Shell لينوکس اطلاعي ندارم) ، قدرت و کارآيي ويندوز در خط فرمان و برنامه نويسي خط فرمان (و قابليت هاي پويا نهفته در ويندوز براي برنامه نويسي اسکريپتي) ،مطلقا به پاي لينوکس نخواهد رسيد(!!!).با این حال مایکروسافت در تلاش است با ابزاری مثل PowerShell،این قابلیت مهم را به ویندوز خود تزریق کند!

براي شروع ابتدا بايد يک موضوع را انتخاب مي کردم.يادم از مطلبي که سالها قبل در يکي از سايتهاي بحث و گفتگو در مورد قدرت خط فرمان DOS بود افتاد.در آن مثال هدف پويا کردن تغيير Desktop Wallpaper ويندوز بود بطوري که با هر بار Restart ويندوز عملي شود.من نيز همين هدف گذاري را در نظر گرفتم.يعني:
«برنامه اي با استفاده از قابليت هاي ويندوز (بدون استفاده از عناصر خارجي و به خصوص نصب هيچ برنامه يا ... در ويندوز) بنویسید که Desktop Wallpaper ويندوز را تغییر دهد.»
البته يايد تاکيد کنم که چون بيشتر هدف آموزشي است،پس انتظار يک برنامه کامل و سرراست را نداشته باشيد.

تاکيد بر چند نکته ضروريست.
اول : تمام کدهاي نوشته شده در اين تاپيک را به صورت يکجا مي توانيد در پايين همين پست،Download کنيد.
دوم: پلتفرم هدف من ويندوز XP خواهد بود (بيشتر کد ها روي 9X پاسخ نمي دهد و بر روي 2000 نيز تست نکرده ام).
سوم : هر کجا از فايل Batch نام بردم منظور فايلي هاي با پسوند BAT است که شامل خطوطي است براي اجرا که مي توان در ويندوز و DOS از اين فايلهاي (براي برنامه نويسي خط دستوري) استفاده کرد.اين فايلها داراي محتويات TEXT بوده و براي اجرا کافيست روي آن Double Click کنيد.براي ديدن و ويرايش آن هم مي توانيد روي آن راست کليک کرده و گزينه Edit را انتخاب کنيد.
چهار : منظور از فايلهاي اسکريپتي (Script) ،فايلهايي با پسوند vbs است که با VBScript نوشته مي شود.اين فايلها در ويندوز اجرايي است و توسط موتور WScript که در ويندوز قرار دارد ،تفسير و اجرا مي شود.البته مي توان از زيان JScript نيز استفاده کرد(با پسوند js).اين دو شبيه هم مي باشند (و کاملا ميتوان به هم ترجمه شوند).براي اجرا و ويرايش اين فايلها مثل فايلهاي Batch عمل کنيد.
پنج : در پست هاي آتي براي افزايش قابليت هاي عمليات خود (با توجه به محدوديت هاي در راه) از دو برنامه کوچک استفاده کرده ام که در جاي مناسب توضيح خواهم داد.فقط تاکيد بر اين موضوع است که علاوه بر فايلهاي اجرايي آن ،Source آنها (به زيان VC6) را نيز در دسترس گذاشته ام.(در تنها فايل ضميمه شده در اين پست).
شش : براي دريافت اطلاعات کامل در مورد دستورات موجود در shell ويندوز (Console) .در Run دستور cmd را اجرا کنيد.سپس در آن دستور Help را تايپ کنيد.تا فهرست دستورات را ملاحظه کنيد.براي هر دستور،عبارت آن را با سوييچ ?/ اجرا کنيد (مثلا ?/ For).
هفت : براي دريافت اطلاعات در مورد اسکريپت نويسي تحت ويندوز،به MSDN مراجعه کنيد.
هشت : در تمام اين مباحث (چه در رابطه با کارکرد اين کدها و يا توضيحات داده شده در مورد ويندوز و ...)،ويندوز vista و Windows7 به هيچ عنوان مد نظر نمي باشد.

برای اطلاعات تکمیلی در مورد دستورات تحت ویندوز (خط دستور) می توانید از Web Link های زیر استفاده کنید:
commandwindows.com (http://commandwindows.com/)
ss64.com (http://ss64.com/nt/)

آبجی
3rd April 2010, 02:47 PM
مقدمه

قبل از شروع بايد ابتدا کمي در مورد فرايند نمايش Wallpaper در ويندوز صحبت کنيم.در تمام نسخه هاي ويندوز از 95 تا XP،ويندوز فقط قادر است يک تصوير Bitmap را نمايش دهد.آدرس فايل حاوي اين تصوير،در رجيستري،در مقداري به نام Wallpaper در کليد HKEY_CURRENT_USER>Control panel>Desktop ،ذخيره مي شود.پس به طور کلي ما براي به روز رساني wallpaper،نياز داريم يکی از سه عمليات زير را انجام دهيم:
1) فايلي که در رجيستري اعلان شده است را رو نويسي کنيم تا با بار گذاري مجدد desktop (چه در هنگام restart و چه در هنگام log off و يا هر دليل ديگر)،تصوير مدنظر ما نمايش داده شود.به عبارت ديگر در هر بار بارگذاري کاربر،تصوير جديدي خواهد ديد.
2) کليد رجيستري گفته شده را به فايل Bitmap مورد نظر خود مقدار دهي کنيم.توجه کنيد که با اين کار نيز مانند حالت قبل تا دوباره دسکتاپ بار گذاري نشود،تغييرات را نخواهيم ديد(البته پيغامي در اين رابطه وجود دارد که وارد جزئيات آن نمي شويم).
3) با توجه به تابع API،SystemParametersInfo با پارامتر SPI_SETDESKWALLPAPER ،عمليات تغيير wallpaper را انجام دهيم(براي توضيحات کاملتر مي توانيد به MSDN مراجعه کنيد).

در تحليل روش هاي فوق ،مي دانيم که روش سوم نياز به اجراي توابع API دارد و تا آنجا که من مي دانم ،امکان اجراي يک تابع API در اسکريپ نويسي يا خط فرمان وجود ندارد (توضيح اينکه بعضي توابع خاص در خط فرمان را مي توان با rundll32 اجرا کرد که در اينجا به کار ما نمي آيد و خارج از اين بحث است).در مورد روش دوم هم يا بايد از API استفاده کنيم (که گفته شد که امکان پذير نيست) و يا از فايل هاي reg استفاده کنيم.اما به نظر من روش اول از تمام روشهاي ذکر شده موثر تر و بهتر است (با توجه به محدوديت هاي مورد نظر ما).در نتيجه، ما در اين بحث از روش اول براي تغيير wallpaper استفاده خواهيم کرد.

اما دو سئوال:
سئوال 1 : اگر در ويندوز فقط مي توان فايل Bitmap را به عنوان Wallpaper نمايش دهد،پس چرا در هنگام تنظيم wallpeper توسط ديالوگ Desktop Properties،ويندوز به ما اجازه انتخاب ديگر فرمت ها را مانند jpg ، gif ، png و .... را مي دهد.
جواب : در واقع در اين حالت (انتخاب فرمت غير Bitmap) ،ويندوز در پشت پرده يک عمليات ديگر هم انجام مي دهد و آن تبديل تصوير غير Bitmap به يک تصوير Bitmap.در واقع در کليد که در بالا آدرسش آمد (HKEY_CURRENT_USER>Control panel>Desktop) در ويندوز هايي که اجازه انتخاب يک تصوير غير Bitmap را مي دهند،مقداري با نام OriginalWallpaper موجود است که آدرس فايل اصلي را نگهداري مي کند و تصوير تبديل شده به Bitmap را در فايل USERPROFILE%\Local Settings\Application Data\Microsoft\Wallpaper1.bmp که در آن %USERPROFILE% يک متغير محيطي بوده (و به آدرس profile کاربر جاري اشاره دارد ،مثلا اگر نام کاربر Ali باشد و ويندوز در درايو C نصب شده باشد ،اين profile در آدرس C:\Documents and Settings\Ali )خواهد بود،رونويسي مي کند.براي تکميل اين نکته توجه شما را به تغيير wallpapre در ويندوز هاي 9x جلب مي کنم که در آنها ،ما فقط اجازه انتخاب يک تصوير Bitmap را داشتيم.
سئوال 2 : اگر قرار است که ما فايل که ويندوز نمايش مي دهد را رونويسي کنيم تا بعد از Restart،يک desktop wallpaper جديد را ببينيم،از کجا بايد بدانيم که اين فايل در کجا قرار دارد.براي اين کار که حتما نياز به API خواهيم داشت تا مقدار wallpaper آدرس HKEY_CURRENT_USER>Control panel>Desktop را بخواند؟آيا اينطور نيست؟
جواب : نه دقيقا!!در واقع با توجه به نکته اي که در جواب سئوال قبل آمد،اگر ما بدانيم که قبلا يک تصوير غير Bitmap را به عنوان تصوير زمينه انتخاب کرده ايم،در اين صورت حتما فايلي که بايد رونوشت کنيم در آدرس USERPROFILE%\Local Settings\Application Data\Microsoft\Wallpaper1.bmp قرار خواهد داشت.پس قبل از استفاده از اين کد ها،يک فايل غير Bitmap را به عنوان Wallpaper انتخاب کنيد!!!!

آبجی
3rd April 2010, 02:48 PM
راه حل اول : اداي وظيفه!

در اولين پست در اين رابطه،مي خواهم از همان کدي که قبلا در مقدمه ي مقدمه بحثش را کردم شروع کنم،تا هم ياد پيش کسوتان اين عرصه (!!!!) را گرامي بدارم و هم تنها کدي که در win 98 هم اجرا مي شود را معرفي کنم.در ضمن اين کد سکوي شروع خوبي خواهد بود تا با کليات خط فرمان آشنا شده و کارکرد فايل Batch را بشناسيد.(البته اين کد را مقداري تغيير داده ام زیرا اصل کد فقط در ویندوز 98 به کار می رفت).

مي توانيد گام هاي زير را براي استفاده از اين کد انجام دهيد تا به هدف خود برسيد:
1) ابتدا يک عکس غير Bitmap را به عنوان Wallpaper انتخاب کنيد يا روي فايل reg.reg (در فايل فشرده شده اولين پست)،Double click کنيد(دليل آن را در پاسخ سئوال دوم بخش مقدمه آورده ام).
2) بهتر است يک پوشه (Directory) را براي اين منظور تخصيص دهيد (مثلا در درايو C يک پوشه به نام ChangeWallpaper بسازيد و اين پوشه را براي اين منظور استفاده کنيد ).از اين به بعد، اين پوشه (در مثال ما C:\ChangeWallpaper) را به نام 'پوشه عملبات' نام مي بريم.
3) فايل Main.bat (که در فايل فشرده شده اولين پست قرار دارد) در پوشه عملبات کپي کنيد.
4) چند عکس که مي خواهيد به عنوان Wallpaper استفاده شوند و باید از فرمت Bitmap باشند،را انتخاب کنيد و در پوشه عمليات کپي کنيد.اگر عکس Bitmap نداريد،مي توانيد توسط Paint ويندوز،عکسهاي فرمت هاي ديگر را باز کرده و به به نوع Bitmap ذخيره (Save as) کنيد.در ضمن هيچ تفاوتي بين انواع Bitmap (دو رنگ،هشت رنگ يا ...) نمي باشد.
5) عکس هاي مرحله قبل (Bitmap هاي کپي شده در پوشه عمليات را که از اين به بعد فقط 'عکس' خطاب مي کنيم).به اين شکل نامگذاري کنيد(ترتيب و تولي 1 ها مهم است):
کد:

1x.bmp , 11x.bmp , 111x.bmp , 1111x.bmp , ...
6) حال x نام 1x.bmp را برداري که در اين صورت به «1.bmp» تبديل مي شود.
7) روي Start>All Program>Startup راست کليک کنيد و گزينه Open را انتخاب کنيد تا پوشه Startup را ببينيد.
8) از فايل Main.bat که در پوشه عمليات قرار دارد،يک Short cut در پوشه Startup بسازيد.اين کار باعث مي شود که در هر بار، بارگذاري کاربر شما (در Log off يا Restart ) يکبار فايل Main.bat اجرا شود.
9) دو بار پشت سر هم ،Log off يا Restart کنيد (توجه کنید که دو بار باید این کار را انجام دهید) !
10) اگر تمام مراحل را درست انجام داده باشيد،Wallpapre شما در هر بار Log off يا Restart (از اين به بعد) تغيير خواهد کرد البته اين تغيير،به همان ترتيبي که هنگام نامگذاري عکسها رعايت کرده بوده ايد،خواهد بود.(يعني عکس 11x.bmp بعد از 1x.bmp مي آيد و عکس 111x.bmp بعد از 11x.bmp و ...)

حال به توضيح برنامه موجود در فايل Main.bat که کد آن به شکل زير است مي پردازم:

کد:

echo off
REM Changing Wallpaper with 5 files below (or more)
REM Create 5 files with names : 1.bmp , 11x.bmp , 111x.bmp ,1111x.bmp , 11111x.bmp

For %%i in (1 11 111 1111 11111) do if not exist "%%ix.bmp" set n=%%i
Ren 1.bmp "%n%x.bmp"
If not exist "%n%1x.bmp" set n=
Ren "%n%1x.bmp" 1.bmp
copy 1.bmp "%USERPROFILE%\Local Settings\Application Data\Microsoft\Wallpaper1.bmp"
در خط اول، نمايش خطوط دستورات موجود در اين فايل روي خروجي،حذف مي شود(خيلي مهم نيست و مي توان آن را حذف کرد).در خطوط دوم و سوم،خطوط توضيحي قرار دارد (مانند Comment ها در ديگر زبانهاي برنامه نويسي مي باشند).براي توشتن خطوط توضيحي در فايل Batch کافيست يا کلمه REM را در ابتدا خط قرار دهيد تا تمام آن خط توضيحي شود و يا کاراکتر ';' (سمي کالون) را در هرکجاي خط که مايليد اضافه کنيد تا کاراکتر هاي بعد از اين کاراکتر،توضيحي در نظر گرفته شوند.
خط پنجم در واقع قلب برنامه است.اين خط يک حلقه تکرار ايجاد مي کند که متغير آن به نام i مي باشد (به کاربرد %% قبل از نام متغير ،در هنگام تعريف و استفاده از اين متغير، کاملا توجه کنيد.در واقع مي توان %% را جزء جدايي ناپذير نام متغير دانست).نام متغير هاي در Batch فایل ،فقط مي تواند تک حرفي بوده و بين حرف بزرگ و کوچک تمايز وجود دارد (به عبارت ديگر بين a و A تفاوت است).صورت کلي حلقه For استفاده شده به شکل زير است (برای توضیحات بیشتر به CMD مراجعه کنید):
کد:

For نام متغير in (دامنه هاي داده( do بدنه حلقه
در اينگونه حلقه ها،عبارت داده شده در قسمت 'دامنه داده ها' به وسيله کاراکتر space (جاي خالي) شکسته شده و در هر بار اجراي حلقه مقدار متغير حلقه برابر با يک جزء از آن خواهد بود.در فايل Main.bat ،در اين حلقه متغير i%% به ترتيب (در هر بار اجرا) مقادير 1 , 11 , 111 , 1111 , 11111 را کسب کرده و به ازاي هر مقدار يکبار بدنه حلقه اجرا مي شود.توجه کنيد که بدنه حلقه به شکل يک خطي است (نمي تواند شامل چند دستور باشد و فقط مي تواند شامل يک دستور باشد).
در اين فايل بدنه حلقه شامل يک دستور شرطي است.شکل کلي دستورات شرطي به سه شکل است که دو تا از مهمترين آنها عبارتند از:



IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
در اولين نوع مي توان دو عبارت (يا دو متغير يا يک متغير و يک عبارت) را با يکديگر براي حالت تساوي مقايسه نمود.توجه کنيد که اين تساوي به مانند مقایسه دو رشته کاراکتري عمل مي کند (در واقع در خط دستور Dos و Windows ، تمام متغير ها از نوع رشته اي در نظر گرفته مي شوند).البته با استفاده ازNOT مي توان عدم تساوي را نيز تست کرد.در شکل دوم نيز مي توان وجود(يا عدم وجود) يک فايل که در مسير filename قرار دارد را تست کرد.چنانچه filename فقط شامل نام فايل (و نه مسير کامل فايل) باشد،فايل در مسير جاري جستجو مي شود.
براي مقدار دهي به يک متغير عمومي (که به نام متغیر محیطی یا Environment نیز شناخته می شود) Dos و ويندوز،بايد از دستور SET استفاده کرد(در مقدمه از متغير USERPROFILE ياد شد.همچنين يکي ديگر از متغير هاي معروف ديگر متغير PATH مي باشد).مثلا دستور set n=AAA،متغيري به نام n را با مقدار AAA مقدار دهي مي کند.چنانچه اين متغير موجود باشد (قبلا مقدار داشته باشد)،مقدار قبلي آن از بين رفته و به مقدار جديد ،مقدار دهي مي شود.براي ديدن فهرست تمام متغير هاي محيطي در ويندوز،ابتدا CMD را اجرا کنيد (در اولين پست به آن اشاره شده است) و سپس در خط فرمان دستور SET را نوشته و Enter را بزنيد.براي استفاده از يک متغير محيطي حتما بايد از دو علامت % ،يکي در قبل و يکي در بعد از نام آن، استفاده کرد.مثلا اگر جايي مقدار درون متغير n مد نظرمان باشد بايد عبارت %n% را به کار بريم.
با اين توضيحات مي توان خط 5 را به اينگونه تفسير کرد که برنامه به دنبال تمام فايلهاي از نوع 1x.bmp , 11x.bmp , 111x.bmp , 1111x.bmp , ... گشته و هرگاه فايل با اين نام نيابد (به ياد آوريد که در مرحله 6 ،x نام يکي از فايلها را برداشته ايد)،رشته اي شامل تعداد يک هاي آن را درون متغير n قرار مي دهد.
در خط ششم فايل batch برنامه نام فايل 1.bmp را به نام فايلي که موجود نيست تبديل مي کند.در خط هفتم،برنامه ابتدا تست مي کند که آيا فايل با يک عدد 'يک' بيشتر وجود دارد يا نه.اگر موجود نيست به اين معني است که به آخر حلقه رسيده است و بايد به ابتدا حلقه برود يعني به سراغ فايل 1x.bmp .به همين دليل مقدار n را به شکل مناسب تنظيم مي کند.در خط هشتم نيز عکسي که اکنون بايد به عنوان پس زمينه نمايش داده شود را به نام 1.bmp تبديل کرده و در نهايت اين عکس را (که اکنون به نام 1.bmp) شناخته مي شود را در جاي مناسب (روي عکسي که پس زمينه جاري است) کپي مي کند.

سئوال 1:من همه کار ها را درست انجام داده ام و تعداد سه عکس را هم در پوشه قرار داده دم ولي برنامه گويا درست کار نمي کند و من چيزي نمي بينم؟
جواب : اگر کمي به کد درون فايل batch دقت کنيد،درخط پنجم يعني همان خطي که داراي حلقه For است، در قسمت داده هاي حلقه ما مي توانيم نام پنج فايل را بدهيم.چنانچه عکسي بيشتر از 5 تا يک داشته باشد ،برنامه فقط 5 تاي اول را نمايش مي دهد و چنانچه تعداد عکسها نيز کمتر از 5 باشد (مانند سئوال شما) برنامه به کل غلطي کار مي کند (چون بعضي از 5 فايل که بايد بيابد را پيدا نمي کند و در نتيجه تصميم گيري اشتباه است).براي رفع اين مشکل شما بايد خودتان به شکل دستي اين فايل Batch را ويرايش کنيد.یعنی اگر فقط سه فايل داريد،در گام پنجم ،آنها را به نامهاي 1x.bmp , 11x.bmp , 111x.bmp نامگذاري کرده و سپس خط پنجم فايل Batch را ويرايش کنيد به شکل
کد:
For %%i in (1 11 111) do if not exist "%%ix.bmp" set n=%%i
البته اگر تعداد فايلهايتان بيش از 5 تا است نيز بايد اين فايل را ويرايش کنيد و قسمت داده هاي حلقه را به شکل مناسب تنظيم نماييد.
سئوال 2:من توانستم عملکرد برنامه را ببينم و در هر بار Reset،يکبار wallpaperام عوض شود ولي وقتي به مسير گفته شده يعني USERPROFILE%\Local Settings\Application Data\Microsoft\Wallpaper1.bmp رفتم،عکسي که قرار داشت با عکس روي ميز کار من متفاوت بود.چرا؟
جواب : در هر بار بارگذاري کاربر،ويندوز يکبار اين عکس را به عنوان wallpaper بارگذاري ميکند و ديگر با آن کاري ندارد (مگر مجبور شود!).در واقع بعد از بار گذاري اين عکس،با اجراي کد ما ،عکس جديد جانشين آن شده تا در بار بعدي بارگذاري اطلاعات کاربر ،مشاهده شود.به عبارت ديگر عکسي که در مسير ذکر شده مشاهده مي کند،همان عکسي است که در دفعه بعد wallpaper شما خواهد بود.
سئوال 3 : اين همه اطلاعات در مورد حلقه For و If و .. را از کجا آورده ايد؟
جواب : همينطور که قبلا توضيح دادم بهترين منبع در اين زمينه خوده ويندوز است.کافيست در cmd عبارتي شبيه ?/ IF يا ?/ FOR را تايپ و سپس enter کنيد.در اينصورت توضيح کاملي در با اين دستورات بدست خواهيد آورد.
سئوال 4 : چرا ما خودمان را اين همه زحمت بدهيم تا بعد از هر بار log off يا Restart عکس wallpaper عوض شود.نرم افزارهايي هستند که اين کار را راحت تر و ساده تر انجام مي دهند.آيا اينطور نيست؟
جواب : من از اولين پست بر اين موضوع تاکيد کردم که اين مباحث جنبه آموزشي دارد و فقط بهانه ايست که بيشتر در مورد ويندوز بدانيم و هيچ دعوي کاربردي بودن اين مثالها را ندارم.بلکه تاکيد مي کنم که ياد گرفتن کاملتر خط فرمان در ويندوز ،مي تواند ما را بهتر در دستيابي به اهدافمان ياري کند.در واقع خيلي از کارهاي مديريتي در ويندوز را بدون نصب نرم افزار مي توان به شکل کاملي اداره کرد (و حتي در گاهي اوقت بهتر از هر نرم افزاري).به خصوص که هدف من استفاده از پيش پا افتاده ترين ابزار است تا به خودم (و شايد ديگران) ياد آورم شود که هميشه نبايد به ديگران محتاج بود و گاهي بايد دست به زانوي خودمان بزنيم و اولين قدم اين راه آموختن است.شايد برخي اعتقاد داشته باشند که مانند اختراع دوباره چرخ است ولي من به اين مباحث به عنوان محملي براي آموختن نگاه مي کنم.براي نمونه چند سال قبل ،هنگامي که سعي کردم سيستمي شبيه ويندوز را در داس پياده سازي کنم (البته به شکل خيلي مختصر که کد آن را در همين سايت در اختيار گذاشته ام)،تازه بعضي نکات ظريف را که قبلا با آن آشنا نبودم يا دقت نمي کردم را (عليرغم چند سال برنامه نويسي با VC) متوجه شدم.این کد های تفریحی(!) می توانند آموزنده و کارا هم باشند!

آبجی
3rd April 2010, 02:50 PM
راه حل دوم: کاربران هميشه تنبل اند!!!!

همانطور که ملاحظه کرديد شايد ملال آور ترين نکته در استفاده از روش مرحله قبل ،ويرايش فايل Main.bat بود.در واقع اگر تعداد عکسها 5 تا نبود (چه بيشتر و چه کمتر) نياز به ويرايش اين فايل وجود داشت که اين موضوع با توجه به اين نکته که کاربران هيچ گاه تمايل به محدود شدن ندارند،هدف بعدي را براي من به اين شکل ترسيم کرد: «برنامه اي مانند مرحله قبل اما اين بار بدون نياز به ويرايش،براي هر تعداد عکس».

برای اجرای این راه حل ،مراحل زیر را انجام دهید:
1) ابتدا يک عکس غير Bitmap را به عنوان Wallpaper انتخاب کنيد يا روي فايل reg.reg (در فايل فشرده شده اولين پست)،Double click کنيد(دليل آن را در پاسخ سئوال دوم بخش مقدمه آورده ام).
2) بهتر است يک پوشه (Directory) را براي اين منظور تخصيص دهيد (مثلا در درايو C يک پوشه به نام ChangeWallpaper بسازيد و اين پوشه را براي اين منظور استفاده کنيد ).از اين به بعد، اين پوشه (در مثال ما C:\ChangeWallpaper) را به نام 'پوشه عملبات' نام مي بريم.
3) فايل MyCW.bat را (که در فايل فشرده شده اولين پست قرار دارد) در پوشه عملبات کپي کنيد.
4) چند عکس که مي خواهيد به عنوان Wallpaper استفاده شوند و از فرمت Bitmap باشد،را انتخاب کنيد و در پوشه عمليات کپي کنيد.اگر عکس Bitmap نداريد،مي توانيد توسط Paintويندوز،عکسهاي فرمت هاي ديگر را باز کرده و به به نوع Bitmap ذخيره (Save as) کنيد.در ضمن هيچ تفاوتي بين انواع Bitmap (دو رنگ،هشت رنگ يا ...) نمي باشد.
5) عکس هاي مرحله قبل (Bitmap هاي کپي شده در پوشه عمليات را که از اين به بعد فقط 'عکس' خطاب مي کنيم).به شکل «WP*.bmp» نامگذاري کنيد که در آن به جای ستاره،یک عبارت قرار دهید (مهم نیست چه عبارتی،فقط طوری باشد که فرمت مورد نظر حفظ شود).مثلا:
کد:

WP1.bmp , WPaa.bmp , WP3.bmp , WP1250.bmp , ....
6) روي Start>All Program>Startup راست کليک کنيد و گزينه Open را انتخاب کنيد تا پوشه Startup را ببينيد.
8) از فايل MyCW.bat که در پوشه عمليات قرار دارد،يک Short cut در پوشه Startup بسازيد.اين کار باعث مي شود که در هر بار، بارگذاري کاربر شما (در Log off يا Restart ) يکبار فايل MyCW.bat اجرا شود.
9) دو بار پشت سر هم ،Log off يا Restart کنيد (توجه کنید که دو بار باید این کار را انجام دهید)!
10) اگر تمام مراحل را درست انجام داده باشيد،Wallpapre شما در هر بار Log off يا Restart (از اين به بعد) تغيير خواهد کرد البته اين تغيير،به همان ترتيبي که هنگام نامگذاري عکسها رعايت کرده بوده ايد،خواهد بود.برای اینکه بدانید کدام عکس به عنوان WallPaper بعدی خواهد بود،کافیست به پوشه عملیات رفته و به دنبال فایلی با نام آغازین «cur» باشید.

فایل MyCW.bat از پنج بخش تشکیل شده است:
بخش اول: برای معرفی متغیر ها است (اگر متغیر ها قبلا در سیستم معرفی شده اند،آنها را به مقدار پیش فرض یعنی مقدار تهی تنظیم می کند):
کد:

SET _FWP_FIRST=""
SET _FWP_CUR=""
SET _FWP_NEXT=""
این سه متغیر ها به ترتیب برای ذخیره نام اولین فایل در لیست فایلها،نام فایل جاری که استفاده شده است و نام فایلی که باید برای مرحله بعد به عنوان WallPaper قرار گیرد،می باشد.
بخش دوم : در این بخش تمام فایلها با فرمت «WP*.bmp» مرتب شده و در فایل Dir.txt ذخیره می شود.سپس تمام آنها برای انجام محاسبات به بخش پنجم ارسال می شود و در نهایت فایل Dir.txt حذف می شود (این فایل به مانند یک بافر برای نگهداری نام فایلها استفاده می شود).در بخش پنجم متغیر های بالا مقدار دهی می شوند.
کد:

dir WP*.bmp /b | SORT > Dir.txt
FOR /F %%i in (Dir.txt) do call :Section2 %%i
del Dir.txt
بخش سوم: با توجه به مقادیر تنظیم شده،اگر لازم باشد (به آخر فهرست رسیده باشم و یا هنوز WallPaper ای تنظیم نشده باشد)،مقادیر مناسب برای متغیر «_FWP_NEXT» تنظیم می شود:
کد:

if %_FWP_CUR=="" (
SET _FWP_NEXT=%_FWP_FIRST%
) ELSE (
if %_FWP_NEXT%=="" SET _FWP_NEXT=%_FWP_FIRST%
del cur_%_FWP_CUR% > nul
)
بخش چهارم: در این بخش عملیات تخصیص WallPaper انجام می شود (فایل بعدی در مسیر WallPaper کپی شود و یک کپی نیز از همین فایل با پیش وند cur ایجاد می شود) و عملیات پایان یافته است.
کد:

copy %_FWP_NEXT% cur_%_FWP_NEXT% > nul
copy %_FWP_NEXT% "%USERPROFILE%\Local Settings\Application Data\Microsoft\Wallpaper1.bmp" > nul
goto :EOF
بخش پنجم: با توجه به مقادیر نام فایل ورودی،اگر فایل با نام فایل ورودی و پیشوند cur وجود داشته باشد،یعنی این فایل به عنوان فایل جاری(_FWP_CUR) است.بعد از یافتن فایل جاری،اولین فایل،فایل بعدی(_FWP_NEXT) است و همواره اولین فایل درخواستی به عنوان فایل اول(_FWP_FIRST) ذخیره می شود.
کد:

:Section2
IF EXIST cur_%1 (
SET _FWP_CUR=%1
) ELSE (
if NOT %_FWP_CUR%=="" (IF %_FWP_NEXT%=="" SET _FWP_NEXT=%1)
if %_FWP_FIRST%=="" SET _FWP_FIRST=%1
)
goto :EOF
نکته : در خطوط بالا،دستور goto :EOF به معنی پایان برنامه است.
این روش،نسبت به روش پست قبل،دارای یک مزیت است و آن اینکه برای ایجاد فهرست بیشتر فایل نیازی به تغییر در فایل MyCW.bat نبوده و کافیست فایل خود را در پوشه عملیات کپی و نامی با فرمت «WP*.bmp» به آن اختصاص دهید.
البته این روش همجنان فایل ها را به ترتیب (یا اصطلاحا از یک کنار) نمایش داده و بعد از رسیدن به آخر لیست،دوباره به اول فهرست بر می گردد.

سئوال 1: این علامت بزرگتر که که در خط:
کد:

dir WP*.bmp /b | SORT > Dir.txt
گذاشتید یعنی چی؟
جواب: این علامت یک عملگر است و مسیر خروجی رو مشخص می کند.به این معنی که خروجی باید در کجا قرار گیرد.به شکل پیشفرض خروجی ما بر روی صفحه نمایش است ولی گاهی اوقات لازم داریم خروجی را به مسیر دیگری هدایت کنیم.مثلا به یک فایل (همچنین این خروجی می تواند چاپگر باشد یا یک اتصال شبکه و یا ...).در اینجا خروجی دستور
کد:

dir WP*.bmp /b | SORT
به جای نمایش بر روی صفحه به یک فایل به نام Dir.txt فرستاده می شود.به این منظور که بتوانیم خروجی دستور را در خطوط بعدی(منظور همان خط For است) مورد تحلیل قرار دهیم.توجه کنید که عملگر «<» باعث می شود که فایل Dir.txt اگر وجود ندارد، ساخته شود و اگر وجود دارد،رو نویسی شود (اطلاعات قبلی آن از بین می رود).عملگر های دیگری هم وجود دارد که یکی دیگر از آنها عملگر «<<» است.این عملگر مانند «<» عمل می کند با این تفاوت که اگر فایل خروجی موجود باشد،محتویات آن را نابود نکرده و محتویات جدید را به انتهای محتویات قبلی اضافه (Append) می کند.
سئوال 2: من دستور «?/ Dir» را توی CMD زدم و فهرست سوئیچ هاش را دیدم. هیچ جا سوئیچی «|» تعریف نشده بود؟!!!
جواب: نه دوست من این سوئیچ نیست،این هم یک عملگر است که به آن عملگر «PipeLine» یا «لوله» می گویند (با توجه به شکل ظاهری اش و کاری که انجام می دهد،کاملا این نام برازنده آن است).این عملگر در واقع خروجی یک دستور (دستور سمت چپ) را به یک دستور دیگر (سمت راست) می فرستد.در اینجا خروجی dir با سوئیچ هایش ،به دستور Sort ارسال می شود تا مرتب شده و به خروجی فرستاده شود.توجه کنید که تمام دستورات را می توان در سمت چپ (فرستنده به) لوله قرار داد ولی هر دستوری را نمی تواند در سمت راست (دریافت کننده از) لوله قرار گیرد و باید دستور مورد نظر، بتواند Pipe را پشتیبانی کند (من خودم نمی توانم چنین دستوری در ویندوز بنویسم ولی مقاله ای کامل به فارسی برای نوشتن چنین دستوراتی در لینوکس دیده ام).
سئوال 3: این عبارت «1%» چیست؟
جواب: در هر برنامه خط دستوری،شما می توانید پارامترهایی برای برنامه بفرستید که در واقع برنامه با این پارامتر ها رفتار مناسب را انجام دهد (باید پارامتر های هر برنامه را بشناسید در ضمن سوئیچ ها هم خود نوعی پارامتر هستند).مثلا اگر در خط دستور تایپ کنید «mspaint» برنامه Paint ویندوز اجرا خواهد شد.حالا اگر تایپ کنید «mspaint 1.bmp» برنامه Paint ویندوز به همراه فایل 1.bmp (البته اگر در مسیر فایل جاری موجود باشد) باز می شود و می توان فایل 1.bmp را ویرایش کنید (این همان اتفاقی است که هنگامی که روی 1.bmp راست کلیک می کنید و گزینه «Edit» را انتخاب می کنید،در پشت صحنه ویندوز می افتد و عکس مورد نظر شما تحت برنامه Paint آماده ویرایش می شود).در واقع اساس کار اجرا هر فایلی در برنامه های مختلف،همین خط دستور و پارامترهای آن است.البته ممکن است پارامترها سوئیچ هایی بوده که رفتار برنامه را تحت تاثیر قرار دهد.پس معقول است که ما بخواهیم Batch فایل های خود را نیز با پارامتر هایی اجرا کنیم.برای دسترسی به این پارامترها در Batch ها،باید از عبارت 1% تا 9% برای پارامترهای اول تا نهم استفاده شود.برای دسترسی به پارامتر دهم به بعد باید از دستور Shift استفاده کنیم (با هر بار اجرای این دستور پارامترها یکی به عقب شیفت پیدا می کنند یعنی مقدار قبلی پارامتر %1 نابود شده و مقدار %2 در آن جای می گیرد،مقدار %3 به %2 منتقل می شود و ... و پارامتر دهم به %9 منتقل خواهد شد).در ضمن هنگامی که روی یک Batch فایل (یا هر فایل اجرایی دیگر) DoubleClick می کنید،این فایل بدون پارامتر اجرا می شود.ملاک جدا سازی پارامترها کاراکتر فضای خالی (Space) می باشد.چنانچه یک پارامتر شما دارای کاراکتر فضای خالیست،حتما آن را در «""» قرار دهید تا به عنوان یک پارامتر شناخته شود.
سئوال 4:با توجه به جواب سئوال قبلی،پس اگر فایل MyCW.bat را با DoubleClick اجرا کنیم و یا در StartUp بگذاریم و خودش اجرا شود،بدون پارامتر اجرا می شود،پس این %1 درون دستورات به چه مقدار اشاره می کند؟!!! MyCW که پارامتر ندارد!!؟
جواب: در جواب باید به دو نکته اشاره شود.اول اینکه اگر برنامه ای بدون پارامتر اجرا شود،هر پارامتر با مقدار رشته خالی (یا همان "") تنظیم می شود و در نتیجه اگر شما از %1 یا هر پارامتر دیگری استفاده کنید،مثل این است که از "" استفاده کرده اید.اما نکته دوم به مکان استفاده از %1 بر می گردد.این پارامتر در بخش پنجم استفاده شده است و بخش پنجم با دستور زیر فراخوان می شود:
کد:

call :Section2 %%i
در واقع این دستور به مانند این است که ویندوز یک بار دیگر فایل MyCW.bat را اجرا می کند ولی به جای اینکه این فایل از ابتدا پردازش شود،مستقیم به برچسب Section2 می پرد و اجرا می شود.و البته در این فراخوان ما یک پارامتر داریم که همان %%i است که ارسال شده است.
سئوال 5:این خروجی nul چیست که برخی دستورات،خروجی خود را به آن می فرستند؟
جواب: خروجی nul در واقع خروجی تهی است.برای اینکه هیچ چیز بر روی صفحه نمایش،نشان داده نشود از عبارت «nul <» استفاده می شود.
سئوال 6: من تمام مراحل را همانطور که شما نوشته بودید انجام دادم فقط در مرحله 2 به جای نام ChangeWallpaper از نام «My Wallpaper» استفاده کردم،ولی برنامه درست کار نمی کند!با این حال همان نام ChangeWallpaper باعث اجرای درست برنامه می شود.چرا؟آیا برنامه به این نام (ChangeWallpaper) حساس است؟
جواب: خیر برنامه به نام ChangeWallpaper حساس نیست ولی یک نکته ظریف و کلیدی در نام گذاری شما موجود نیست.شما نمی توانید از نامی شامل کاراکتر فضای خالی (SPACE) استفاده کنید (این مشکل را در راه حل پنجم حل خواهیم کرد! برای پیدا کردن دلیل مشکل به پاسخ سئوال سوم نگاه کنید).به عبارت دیگر به جای استفاده از My Wallpaper بهتر است از MyWallpaper یا My_Wallpaper استفاده کنید.بطور کلی مواظب باشید که در سه مکان زیر فضای خالی در نام موجود نباشد:- نام پوشه عملیات
- نام پوشه های پدر پوشه عملیات (پس نمی توانید پوشه عملیات خود را در پوشه Program Files یا فرزندان آن قرار دهید)
-نام عکس ها

آبجی
3rd April 2010, 02:51 PM
راه حل سوم: هیچ کس از تنوع بدش نمی آید!!!!

تا این جا توانستیم یک فهرست (البته با کپی فایل ها در یک پوشه و نام گذاری آنها با یک فرمت خاص) از تصاویر Bitmap ایجاد و این تصاویر را به ترتیب نمایش دهیم.اما تنوع هم چیز بدی نیست!کاش بتوانیم کاری کنیم که یک تصویر به تصادف از فهرست ما انتخاب شود.پس دست به کار شوید تا «برنامه ای بنویسید که با دریافت یک فهرست از تصاویر ،یکی از آنها را به تصادف انتخاب و به عنوان WallPaper نمایش دهد».

برای اینکه خروجی این بخش را ببینید،مراحل زیر را به دقت دنبال کنید:
1) ابتدا يک عکس غير Bitmap را به عنوان Wallpaper انتخاب کنيد يا روي فايل reg.reg (در فايل فشرده شده اولين پست)،Double click کنيد(دليل آن را در پاسخ سئوال دوم بخش مقدمه آورده ام).
2) بهتر است يک پوشه (Directory) را براي اين منظور تخصيص دهيد (مثلا در درايو C يک پوشه به نام ChangeWallpaper بسازيد و اين پوشه را براي اين منظور استفاده کنيد ).از اين به بعد، اين پوشه (در مثال ما C:\ChangeWallpaper) را به نام 'پوشه عملبات' نام مي بريم.
3) فايلهای MyCW2.bat و MyCW2.vbs را (که در فايل فشرده شده اولين پست قرار دارد) در پوشه عملبات کپي کنيد.
4) چند عکس که مي خواهيد به عنوان Wallpaper استفاده شوند و از فرمت Bitmap باشد،را انتخاب کنيد و در پوشه عمليات کپي کنيد.اگر عکس Bitmap نداريد،مي توانيد توسط Paintويندوز،عکسهاي فرمت هاي ديگر را باز کرده و به به نوع Bitmap ذخيره (Save as) کنيد.در ضمن هيچ تفاوتي بين انواع Bitmap (دو رنگ،هشت رنگ يا ...) نمي باشد.
5) عکس هاي مرحله قبل (Bitmap هاي کپي شده در پوشه عمليات را که از اين به بعد فقط 'عکس' خطاب مي کنيم).به شکل «WP*.bmp» نامگذاري کنيد که در آن به جای ستاره،یک عبارت قرار دهید (مهم نیست چه عبارتی،فقط طوری باشد که فرمت مورد نظر حفظ شود و شامل فضای خالی نباشد).مثلا:
کد:

WP1.bmp , WP2.bmp , WPaa.bmp , WP1250.bmp , ....
6) روي Start>All Program>Startup راست کليک کنيد و گزينه Open را انتخاب کنيد تا پوشه Startup را ببينيد.
8) از فايل MyCW2.bat که در پوشه عمليات قرار دارد،يک Short cut در پوشه Startup بسازيد.اين کار باعث مي شود که در هر بار، بارگذاري کاربر شما (در Log off يا Restart ) يکبار فايل MyCW2.bat اجرا شود.
9) دو بار پشت سر هم ،Log off يا Restart کنيد (توجه کنید که دو بار باید این کار را انجام دهید)!
10) اگر تمام مراحل را درست انجام داده باشيد،Wallpapre شما در هر بار Log off يا Restart (از اين به بعد) تغيير خواهد کرد.

اما قبل از توضیح این کدها،باید یک نکته ظریف روشن شود.ما در خط دستور شاید بتوانیم کارهای زیادی انجام دهیم،ولی همه کار نمی توانیم بکنیم! مثلا تولید یک عدد تصادفی!غیر ممکن است.به همین دلیل مجبور به استفاده از یک زبان جانبی هستیم.من از VB Script استفاده کردم که دو مزیت دارد:
1) در تمام ویندوز ها به شکل پیشفرض نصب است
2) خیلی از توابع و قابلیت ها در آن (به خاطر انعطاف پذیر کردن آن) وجود دارد که شما در خط دستور ندارید.مثلا تولید عدد تصادفی! یا ارتباط با یک شی COM و ...
البته باید یاد آور شوم که به جای استفاده از VB Script می توان از JScript هم استفاده کرد.در ضمن خیلی از کارها که در برنامه های قبل در خط دستور انجام دادیم،می توان به VB Script محول کرد.

در برنامه این پست ،ما دو فایل داریم.یک فایل MyCW2.bat است.این فایل خود به دو بخش تقسیم می شود.
بخش اول با کد:
کد:

dir WP*.bmp /b | SORT > Dir.txt
MyCW2.vbs
FOR /F %%i in (Dir.txt) do call :Section2 %%i
del Dir.txt
goto :EOF
ابتدا یک فایل با نام Dir.txt با ایجاد فهرستی مرتب از فایل های با فرمت «WP*.bmp» ایجاد کرده و سپس با فراخوانی MyCW2.vbs،عملا یک فایل از این فهرست (محتویات Dir.txt )انتخاب شده و باز گردانده می شود.توجه کنید که منظور از باز گرداندن ذخیره دوباره در فایل Dir.txt می باشد.به عبارت دیگر قیل از اجرای MyCW2.vbs، فایل Dir.txt حاوی فهرستی از فایل های منتظر برای انتخاب شدن هستند ولی پس از اجرای فایل مذکور،فایل Dir.txt حاوی فقط یک خط است! و آن هم فایل انتخاب شده است.در نهایت هم همان یک خط Dir.txt خوانده شده و به بخش دوم MyCW2.bat،برای تخصیص به عنوان WallPaper ارجاع می شود.
در بخش دوم نیز فایل مورد نظر که در تنها ورودی این بخش ذخیره شده است، به عنوان WallPaper تخصیص یافته و کار این بخش پایان یافته است.

اما فایل MyCW2.vbs نیز حاوی کد مکمل است.این برنامه،محتویات فایل Dir.txt را خوانده و یک خط به شکل تصافی از بین خطوط آن انتخاب و تمام خطوط دیگر فایل Dir.txt به استثنای خط مورد نظر،حذف می شود.در نتیجه خروجی این برنامه نیز تنها خط باقیمانده در فایل Dir.txt خواهد بود.
در این کد فایل،بعد از معرفی متغیر ها و ثوابت لازم،خطوط زیر:
کد:

Set objFSO = CreateObject("Scripting.FileSystemObject")
' Open file for reading.
Set objTextFile = objFSO.OpenTextFile("Dir.txt", ForReading)
Count = 0
Do While objTextFile.AtEndOfStream <> True
sRead = objTextFile.ReadLine
Count = Count + 1
Loop
objTextFile.Close
با ایجاد یک شی فایل و باز کردن فایل Dir.txt تعداد خطوط آن را شمارش کرده و در متغیر Count ذخیره می کند.در نهایت هم فایل مورد نظر را می بندد.سپس در دو خط بعدی،یعنی:
کد:
Randomize ' Initialize random-number generator.
Rand = Int((Count * Rnd) + 1)
با ایجاد یک فرایند واقعا تصادفی،عددی تصادفی بین یک تا Count تولید و در Rand ذخیره می نماید.سپس در قسمت بعدی کد یعنی:
کد:

Set objTextFile = objFSO.OpenTextFile("Dir.txt", ForReading)
Count = 0
Do While Count < Rand
sRead = objTextFile.ReadLine
Count = Count + 1
Loop
objTextFile.Close
یک بار دیگر فایل Dir.txt را باز و خط «Rand ام» را خوانده و محتویات آن را در متغیر sRead ذخیره می کند.توجه کنید که در انتهای کار خود،فایل مورد نظر را می بندد.در پایان نیز باید فایل Dir.txt را ،این بار برای رونویسی،باز کرده و تنها خط مورد نظر (خط انتخاب شده به شکل تصادفی) را در آن بنویسید (فایل برای نوشتن باز شده است به طوری که تمام محتویات آن نابود شود).این فرایند در خطوط زیر رخ می دهد:
کد:

Set objTextFile = objFSO.OpenTextFile("Dir.txt", ForWriting, True)
objTextFile.WriteLine(sRead)
objTextFile.Close
همانطور که می بینید، برنامه MyCW2.bat با فراخوانی مناسب،برخی وظایف را به MyCW2.vbs محول می کند و این دو به کمک هم،فرایند ایجاد یک Wallpaper تصادفی را انجام می دهند.

سئوال 1: آیا واقعا نیاز به دو فایل برای این کار بود و نمی شود همه را در یک فایل تجمیع کرد؟
جواب: همانطور که توضیح داده شد،تولید عدد تصادفی در خط دستور امکان پذیر نیست،پس نیاز به فایل اجرایی غیر از Batch فایل (در اینجا VB Script) وجود دارد.ولی با کمی تلاش، می شود تمام وظایف فایل MyCW2.bat را به MyCW2.vbs منتقل کرد و کلا برنامه را تحت یک فایل آن هم از نوع VB Script نوشت (با این حال کد تولید در VB Script از کد سرراست Batch،پیچیده تر خواهد بود).
سئوال 2: من چند بار Logg off کردم ولی هر بار یک عکس انتخاب می شود (در کل یک عکس را بیشتر از بقیه نشان می دهد)؟
جواب: انتخاب یک عکس از فهرست عکس ها تصادفی انجام می شود و در این تصادف از بین تمام عکس ها انتخاب می شود و احتمال اینکه در چند بار Log off یا Restart ،عکس واحدی انتخاب شود،صفر نیست!توجه کنید که این فرایند تصادفی است و ممکن است خروجی هر بار مثل بار قبل هم باشد.

آبجی
3rd April 2010, 02:51 PM
راه حل چهارم: حجم فایل Bitmap خیلی زیاد است!

همانطور که گفته شد،ویندوز فقط فایل های Bitmap را به عنوان Wallpaper قبول می کند (به مقدمه مراجعه شود)،ولی ما معمولا از فایل های Bitmap استفاده نمی کنیم،زیرا دارای حجم زیادی هستند.در مقابل فایل های JPEG ، GIF ، PNG و ... دارای حجم کمتری همراه با کیفیت بهتری هستند و کاربران معمولا در آرشیو عکس های خود از این نوع فایل ها استفاده می کنند و نه Bitmap.پس هدف این است : «برنامه را طوری تغییر دهید که بتواند فایل غیر Bitmap نیز به عنوان Wallpaper انتخاب کند»

با توجه به توضیحات گذشته،تبدیل یک تصویر غیر Bitmap به Bitmap کار ساده ای نیست.به همین منظور باید از یک برنامه خارجی (منظور خارج از Batch فایل و VB Script است) کمک بگیریم.برای رسیدم به این هدف برنامه ای را با VC6 (در نتیجه در تمام نسخه های ویندوز از 98 به بالا کار می کند) با نام CI (کد منبع آن در فایل پیوست پست اول تاپیک موجود است) نوشتم که با استفاده از OleLoadPicture و PICTURE::SaveAsFile، یک تصویر را به یک Bitmap تبدیل می کند.این برنامه با دریافت دو پارامتر کار می کند.پارامتر اول آدرس فایل تصویری است که باید تبدیل به Btmap شود و دومی نام فایل مقصد از که باید تصویر تبدیل شده به Bitmap ،در آنجا ذخیره شود.برای دریافت راهنما (پارامتر های ورودی و مقدار خروجی برنامه)، از سوئیچ ?/ استفاده کنید.همچنین در این قسمت می توان از همان کد MyCW2.vbs برای ایجاد یک فایل تصادفی استفاده کرد.پس مراحل زیر را انجام دهید:
1) ابتدا يک عکس غير Bitmap را به عنوان Wallpaper انتخاب کنيد يا روي فايل reg.reg (در فايل فشرده شده اولين پست)،Double click کنيد(دليل آن را در پاسخ سئوال دوم بخش مقدمه آورده ام).
2) بهتر است يک پوشه (Directory) را براي اين منظور تخصيص دهيد (مثلا در درايو C يک پوشه به نام ChangeWallpaper بسازيد و اين پوشه را براي اين منظور استفاده کنيد ).از اين به بعد، اين پوشه (در مثال ما C:\ChangeWallpaper) را به نام 'پوشه عملبات' نام مي بريم.
3) فايلهای MyCW3.bat و MyCW2.vbs و CI.exe را (که در فايل فشرده شده اولين پست قرار دارد) در پوشه عملبات کپي کنيد.
4) چند عکس که مي خواهيد به عنوان Wallpaper استفاده شوند را انتخاب کنيد و در پوشه عمليات کپي کنيد.توجه کنید که فرمت تصاویر مهم نیست.
5) عکس هاي مرحله قبل (تصاویر کپي شده در پوشه عمليات را که از اين به بعد فقط 'عکس' خطاب مي کنيم) را طوری نام گذاری کنید که پسوند آن jpg باشد.توجه کنید که نام فایل و فرمت نام مهم نیست (هر چه می خواهید قرار دهید)،فقط پسوند فایل را به jpg تغییر دهید،حتی اگر تصاویر شما دارای فرمت دیگری به غیر از نوع JPEG است.
6) روي Start>All Program>Startup راست کليک کنيد و گزينه Open را انتخاب کنيد تا پوشه Startup را ببينيد.
8) از فايل MyCW3.bat که در پوشه عمليات قرار دارد،يک Short cut در پوشه Startup بسازيد.اين کار باعث مي شود که در هر بار، بارگذاري کاربر شما (در Log off يا Restart ) يکبار فايل MyCW3.bat اجرا شود.
9) دو بار پشت سر هم ،Log off يا Restart کنيد (توجه کنید که دو بار باید این کار را انجام دهید)!
10) اگر تمام مراحل را درست انجام داده باشيد،Wallpapre شما در هر بار Log off يا Restart (از اين به بعد) تغيير خواهد کرد.

اما فرایند کار خیلی سر راست است.در فایل MyCW3.bat،ابتدا یک فهرست از تمام فایل های jpg تهیه و در Dir.txt ذخیره می شود.سپس با استفاده از MyCW2.vbs (با همان شرحی که در پست قبل داده شد) یک فایل به شکل تصافی از نامهای تصادفی درون Dir.txt انتخاب و دیگر نامها درون Dir.txt حذف می شوند.در پایان MyCW3.bat ،فایل انتخاب شده را با استفاده از CI ،اولا تبدیل به Bitmap می کند و ثانیا در جای مناسب برای تغییر Wallpaper ذخیره می نماید.

آبجی
3rd April 2010, 02:52 PM
راه حل پنجم : امنیت بعلاوه رفع Bug ، فرایند توسعه ی هر برنامه!

امنیت اصلا چیز بدی نیست! اما گاهی اوقات دست و پا گیر می شود! ممکن است برنامه مورد نظر ما نتواند برخی عملیات های حیاتی را انجام دهد.خوب در نگاه اول به نظر می رسد در این کد هایی که ما نوشته ایم،هیچ نکته دست و پا گیری نبود که «شاید» مشکل امنیتی ایجاد کند! اما در کدهای راه حل های قبل یک نکته مهم وجود دارد که ممکن است مشکل ساز شود.یعنی ایجاد، حذف و تغییر فایل dir.txt! در واقع کاربری که اقدام به اجرای برنامه راه حل های قبل می کند،باید اجازه تغییر در پوشه عملیات را داشته باشد زیرا باید کاربر بتواند (اجازه داشته باشد) فایلی بسازد،تغییر دهد و حذف کند.حالا اگر کاربر مورد نظر این اجازه را نداشته باشد،برنامه با خطا مواجه خواهد شد.پس یک نکته مهم برای هدف بعدی برنامه داریم «تغییر برنامه به شکلی که بدون دردسر امنیتی از عهده ساخت،ویرایش و حذف فایل Dir.txt برآید».
اما در برنامه یک باگ مهم هر موجود بود،اگر یک فضای خالی در نام عکس ها یا پوشه عملیات یا میسر پوشه ی عملیات باشد،مشکل به وجود آمده و برنامه کار نمی کند.در نتیجه یک هدف دیگر نیز خواهیم داشت «رفع باگی که از وجود فضای خالی در نام یا مسیر فایل عکس ایجاد می شود».
و اما مبحث توسعه نوع دریافت نام فایل های عکس هم بسیار مهم است.در واقع تا اینجا،برنامه فقط می توانست تصاویر موجود در پوشه عملیات را نشان دهد،در نتیجه برای ایجاد یک گلچین از تصاویر باید حتما تمام آنها را در پوشه عملیات کپی کنیم که این خود ،هدر دادن فضای Hard Disk است! پس یک هدف دیگر نیز در تصحیح خود وارد می کنیم «تغییر برنامه تا بتواند اطلاعات را از یک فایل بخواند.نوع اطلاعات این فایل به این شکل است که که نوع فایل متنی بوده و در هر خط فایل آدرس کامل یک تصویر موجود است.همچنین نام (یا آدرس کامل) این فایل ،خود به عنوان پارامتر به برنامه ارسال می شود»

در نتیجه چکیده این اهداف به این شرح است:
1) تغییر برنامه به شکلی که بدون مشکلات دسترسی کاربری، از عهده ساخت،ویرایش و حذف فایل Dir.txt برآید
2) رفع باگی که از وجود فضای خالی در نام یا مسیر فایل عکس ایجاد می شود
3) تغییر برنامه تا بتواند اطلاعات را از یک فایل بخواند.نوع اطلاعات این فایل به این شکل است که که نوع فایل متنی بوده و در هر خط فایل آدرس کامل یک تصویر موجود است.همچنین نام (یا آدرس کامل) این فایل ،خود به عنوان پارامتر به برنامه ارسال می شود
روش اول : کپی عکس ها در مسیر برنامه:
1) ابتدا يک عکس غير Bitmap را به عنوان Wallpaper انتخاب کنيد يا روي فايل reg.reg (در فايل فشرده شده اولين پست)،Double click کنيد(دليل آن را در پاسخ سئوال دوم بخش مقدمه آورده ام).
2) بهتر است يک پوشه (Directory) را براي اين منظور تخصيص دهيد (مثلا در درايو C يک پوشه به نام ChangeWallpaper بسازيد و اين پوشه را براي اين منظور استفاده کنيد ).از اين به بعد، اين پوشه (در مثال ما C:\ChangeWallpaper) را به نام 'پوشه عملبات' نام مي بريم.نام پوشه می تواند شامل فضای خالی هم باشد.
3) فايلهای MyCW4.bat و MyCW4.vbs و CI.exe را (که در فايل فشرده شده اولين پست قرار دارد) در پوشه عملبات کپي کنيد.
4) چند عکس که مي خواهيد به عنوان Wallpaper استفاده شوند را انتخاب کنيد و در پوشه عمليات کپي کنيد.توجه کنید که فرمت تصاویر مهم نیست.
5) عکس هاي مرحله قبل (تصاویر کپي شده در پوشه عمليات را که از اين به بعد فقط 'عکس' خطاب مي کنيم) را طوری نام گذاری کنید که پسوند آن jpg باشد.توجه کنید که نام فایل و فرمت نام مهم نیست (هر چه می خواهید قرار دهید)،فقط پسوند فایل را به jpg تغییر دهید،حتی اگر تصاویر شما دارای فرمت دیگری به غیر از نوع JPEG است.نام ها می تواند شامل فضای خالی هم باشد.
6) روي Start>All Program>Startup راست کليک کنيد و گزينه Open را انتخاب کنيد تا پوشه Startup را ببينيد.
8) از فايل MyCW4.bat که در پوشه عمليات قرار دارد،يک Short cut در پوشه Startup بسازيد.اين کار باعث مي شود که در هر بار، بارگذاري کاربر شما (در Log off يا Restart ) يکبار فايل MyCW4.bat اجرا شود.
9) دو بار پشت سر هم ،Log off يا Restart کنيد (توجه کنید که دو بار باید این کار را انجام دهید)!
10) اگر تمام مراحل را درست انجام داده باشيد،Wallpapre شما در هر بار Log off يا Restart (از اين به بعد) تغيير خواهد کرد.

روش دوم: استفاده از یک فهرست از تصاویر:
1) ابتدا يک عکس غير Bitmap را به عنوان Wallpaper انتخاب کنيد يا روي فايل reg.reg (در فايل فشرده شده اولين پست)،Double click کنيد(دليل آن را در پاسخ سئوال دوم بخش مقدمه آورده ام).
2) بهتر است يک پوشه (Directory) را براي اين منظور تخصيص دهيد (مثلا در درايو C يک پوشه به نام ChangeWallpaper بسازيد و اين پوشه را براي اين منظور استفاده کنيد ).از اين به بعد، اين پوشه (در مثال ما C:\ChangeWallpaper) را به نام 'پوشه عملبات' نام مي بريم.نام پوشه می تواند شامل فضای خالی هم باشد.
3) فايلهای MyCW4.bat و MyCW4.vbs و CI.exe را (که در فايل فشرده شده اولين پست قرار دارد) در پوشه عملبات کپي کنيد.
4) در پوشه عملیات یک فایل متنی ایجاد و یک نام دلخواه (مثلا List.txt) برای آن انتخاب کنید.از این به بعد از این فایل به نام 'فایل فهرست' نام می بریم.
5) چند عکس که مي خواهيد به عنوان Wallpaper استفاده شوند را انتخاب کنيد و مسیر کامل آنها را در فایل فهرست کپی کنید مثلا:
کد:

C:\MY Pictue\3d\1.jpg
C:\MY Pictue\3d\My Pic.gif
C:\MY Pictue\wallpaper\Best1.png
C:\MY Pictue2\wallpaper\Best1.png
توجه کنید که مسیر کامل را نوشته و مسیر می تواند شامل فضای خالی نیز باشد.
6) روي Start>All Program>Startup راست کليک کنيد و گزينه Open را انتخاب کنيد تا پوشه Startup را ببينيد.
7) از فايل MyCW4.bat که در پوشه عمليات قرار دارد،يک Short cut در پوشه Startup بسازيد.اين کار باعث مي شود که در هر بار، بارگذاري کاربر شما (در Log off يا Restart ) يکبار فايل MyCW4.bat اجرا شود.
8) روی Short cut ساخته شده در مرحله قبل Right Click کنید و گزینه Properties را انتخاب و در زبانه Shortcut در مقابل گزینه Target می توانید آدرس کامل فایل MyCW4.bat را ببینید.به انتهای این آدرس یک فضای خالی اضافه کرده و نام فایل فهرست (در مثال ما List.txt) را تایپ کنید (توجه کنید که باید این تغییرات را اضافه کنید نه جانشین).چنان نام فایل فهرست شما دارای فضای خالیست،حتما آن ار در یک جفت کوتیشن ("") قرار دهید.
9) دو بار پشت سر هم ،Log off يا Restart کنيد (توجه کنید که دو بار باید این کار را انجام دهید)!
10) اگر تمام مراحل را درست انجام داده باشيد،Wallpapre شما در هر بار Log off يا Restart (از اين به بعد) تغيير خواهد کرد.

اما قبل از توضیح کد برنامه،بگذارید دو نکته که در نوشتن کد باید استفاده شود را حل کنیم.اولین نکته،هدف اول است یعنی «مکانی از Hard Disk که مشکل دسترسی برای ساخت،ویرایش و حذف فایل Dir.txt نداشته باشیم».دوستان برنامه نویس می دانند که بهترین مکان برای این مورد پوشه TEMP کاربر می باشد (اکثر نرم افزار های دیگر هم از همین روش استفاده می کنند).پس برنامه باید فایل Dir.txt را در پوشه TEMP کاربر بسازد.برای دسترسی به آدرس پوشه TEMP کافیست از متغیر محیطی %temp% استفاده کنید.همچنین برای دسترسی به این آدرس در VB Script می توان از دستور:
کد:

Set fso = CreateObject("Scripting.FileSystemObject")
Const TemporaryFolder = 2
Set tfolder = fso.GetSpecialFolder(TemporaryFolder)
استفاده کنید که در این صورت tfolder آدرس کامل پوشه TEMP را در خود خواهد داشت.
نکته بعد در مورد رفع باگ فضای خالیست.همانطور که در جواب سئوال 3 راه حل دوم گفته شد،حل این مشکل با استفاده از یک جفت کوتیشن ("") است.به همین منظور کافیست در هنگام ارسال پارامتر حاوی نام فایل عکس ،پارامتر را در یک جفت کوتیشن قرار دهید یعنی عبارت:
کد:

call :Section2 %%i
را به
کد:

call :Section2 "%%i"
تغییر دهید.
اما در مورد استفاده از فایل فهرست،شاید در نگاه اول تهیه Dir.txt از روی فایل فهرست سخت به نظر آید ولی در واقع کاربر با ایجاد فایل فهرست،مرحله تولید فایل Dir.txt را دستی انجام می دهد.پس کافیست یک کپی از فایل فهرست با عنوان Dir.txt ایجاد کنیم و کار تمام است!

خوب حالا باید کمی در مورد کد برنامه صحبت کنیم.به دلیل سادگی از کد MyCW4.vbs شروع می کنیم.این کد،دقیقا همان کاری را انجام می دهد که کد MyCW2.vbs انجام می داد (با همان توضیحات).با این تفاوت که بجای خواندن Dir.txt از مسیر جاری،آن را از پوشه TEMP بخواند.البته با توجه به اینکه باز کردن این فایل چند بار انجام می شود،یک تابع به نام OpenListFile نوشته شده است که وظیفه یافتن و باز کردن فایل Dir.txt در پوشه TEMP را بر عهده دارد.ورودی این تابع مشخص می کند که آیا فایل را باید برای خواندن باز کند یا برای رو نویسی.دیگر خطوط کد همان است که در MyCW2.vbs توضیح داده شد.
در مورد کلیات کد MyCW4.bat هم به مانند MyCW3.bat است.این کد را می توان در سه بخش تقسیم نمود:
بخش اول: برای ایجاد فایل Dir.txt که کد زیر می باشد:
کد:

if EXIST %1 goto CopyFile
dir *.jpg /b | SORT > %temp%\Dir.txt
goto DirReady

:CopyFile
copy %1 %temp%\Dir.txt > nul
goto DirReady
در خط اول اگر چنانچه به برنامه پارامتری پاس داده شده باشد،برنامه از وجود چنین فایلی (همان فایل فهرست) اطمینان حاصل کرده و سپس با پرش به قسمت CopyFile،فایل فهرست را به عنوان فایل Dir.txt کپی می کند.و به قسمت بعد می رود.اما چنانچه پارامتری به برنامه ارسال نشده بود و یا پارامتر نا معتبر بود،برنامه به دنبال تصاویر در پوشه جاری گشته و تمام تصاویر jpg ار فهرست و در Dir.txt فهرست کرده و به گام بعد می رود.
بخش دوم: در این بخش با کد:
کد:

:DirReady
MyCW4.vbs
FOR /F "delims=?" %%i in (%temp%\Dir.txt) do call :Section2 "%%i"
del %temp%\Dir.txt
goto :EOF
برنامه با فراخوانی MyCW4.vbs ،نام فایل منتخب را یافته (یادآوری می شود که خروجی MyCW4.vbs،همان فایل Dir.txt است با یک خط که شامل آدرس کامل فایل منتخب است) و به بخش بعدی (Section2) ارسال می کند.در این فرایند دو نکته حائز اهمیت است که هر دو مربوط به هدف دوم (رفع باگ ناشی از وجود فضای خالی در نام) است:
1) استفاده از جفت کوتیشن در طرفین %%i برای ارسال یک پارامتر واحد که ممکن است شامل فضای خالی نیز باشد
2) استفاده از عبارت
کد:

"delims=?"
در For.در واقع اگر به توضیحات For مراجعه کرده باشید،متوجه خواهید شد که سوئیچ F/ برای خواندن اطلاعات ترتیبی از یک فایل به کار می رود و برای جدا سازی این اطلاعات از هم دو ملاک وجود دارد،یکی فضای خالی (SPACE) و یکی کاراکتر خط بعد(r\n\ یا CrLf).در واقع دومی هدف ماست ولی اولی (فضای خالی) مشکل ساز می شود.به همین دلیل کافیست روش جدا سازی را عوض کنیم و به جای حالت پیشفرض (یعنی فضای خالی و خط جدید) از یک جدا کننده دیگر (در اینجا ? استفاده شده است).توجه کنید که چون فایل دارای فقط یک داده است،این روش مشکلی ایجاد نمی کند و تمام اطلاعات (آدرس کامل فایل تصویر منتخب) به شکل یکجا خوانده می شود.
بخش سوم: این بخش که حاوی کد:
کد:

:Section2
CI %1 "%USERPROFILE%\Local Settings\Application Data\Microsoft\Wallpaper1.bmp" > nul
goto :EOF
با استفاده برنامه CI اقدام به تبدیل تصویر منتخب به Bitmap کرده و در ضمن در جای مناسب هم کپی می کند.

سئوال: در این برنامه شانس انتخاب شدن هر عکس با عکس دیگر برابر است.ولی من می خواهم شانس انتخاب شدن یک تصویر خاص، دو برابر دیگر تصاویر باشد! آیا این امکان پذیر است؟
جواب: بله، به راحتی امکان پذیر است.برای این منظور شما باید از روش فایل فهرست استفاده کنید و در این فایل هر چه بخواهید نام فایل مورد نظر خود را تکرار کنید.مثلا اگر فهرست اصلی به شکل:
کد:

C:\MY Pictue\3d\1.jpg
C:\MY Pictue\3d\My Pic.gif
C:\MY Pictue\wallpaper\Best1.png
C:\MY Pictue2\wallpaper\Best1.png
است و شما می خواهید تصویر My Pic.gif از شانس سه برابری برای انتخاب نسبت به دیگر فایل ها،برخوردار باشد،کافیست این فایل را به این شکل تغییر دهید:
کد:

C:\MY Pictue\3d\1.jpg
C:\MY Pictue\3d\My Pic.gif
C:\MY Pictue\3d\My Pic.gif
C:\MY Pictue\3d\My Pic.gif
C:\MY Pictue\wallpaper\Best1.png
C:\MY Pictue2\wallpaper\Best1.png

آبجی
3rd April 2010, 02:53 PM
راه حل ششم : جمع بندی برای استفاده راحت تر!

برای پایان این سلسه نکات،به نظرم رسید کمی کارآیی را (با استفاده از یک برنامه دیگر) بالاتر ببرم.به همین دلیل برنامه ای به نام SDW را با VC6 طراحی کردم (کد به ضمیمه در پست اول تاپیک موجود است) که با دریافت یک آدرس فایل تصویر،آن را به عنوان تصویر زمینه Desktop قرار دهید (این کار با استفاده از تابع API به نام SystemParametersInfo انجام می شود).برای دریافت راهنما (پارامتر های ورودی و مقدار خروجی برنامه)، از سوئیچ ?/ استفاده کنید.در نتیجه با استفاده از این برنامه می توان هر لحظه که اراده کردید،Desktop Wallpaper خود را تغییر دهید.

برای استفاده از این برنامه مراحل زیر را انجام دهید:
1) بهتر است يک پوشه (Directory) را براي اين منظور تخصيص دهيد (مثلا در درايو C يک پوشه به نام ChangeWallpaper بسازيد و اين پوشه را براي اين منظور استفاده کنيد ).از اين به بعد، اين پوشه (در مثال ما C:\ChangeWallpaper) را به نام 'پوشه عملبات' نام مي بريم.نام پوشه می تواند شامل فضای خالی هم باشد.
2) فايلهای MyCW5.bat و MyCW4.vbs و CI.exe و SDW.exe را (که در فايل فشرده شده اولين پست قرار دارد) در پوشه عملبات کپي کنيد.
3) در پوشه عملیات یک فایل متنی ایجاد و یک نام دلخواه (مثلا List.txt) برای آن انتخاب کنید.از این به بعد از این فایل به نام 'فایل فهرست' نام می بریم.
4) چند عکس که مي خواهيد به عنوان Wallpaper استفاده شوند را انتخاب کنيد و مسیر کامل آنها را در فایل فهرست کپی کنید مثلا:
کد:

C:\MY Pictue\3d\1.jpg
C:\MY Pictue\3d\My Pic.gif
C:\MY Pictue\wallpaper\Best1.png
C:\MY Pictue2\wallpaper\Best1.png
توجه کنید که مسیر کامل را نوشته و مسیر می تواند شامل فضای خالی نیز باشد.
5) روي Start>All Program>Startup راست کليک کنيد و گزينه Open را انتخاب کنيد تا پوشه Startup را ببينيد.
6) از فايل MyCW5.bat که در پوشه عمليات قرار دارد،يک Short cut در پوشه Startup بسازيد.اين کار باعث مي شود که در هر بار، بارگذاري کاربر شما (در Log off يا Restart ) يکبار فايل MyCW5.bat اجرا شود.
7) روی Short cut ساخته شده در مرحله قبل Right Click کنید و گزینه Properties را انتخاب و در زبانه Shortcut در مقابل گزینه Target می توانید آدرس کامل فایل MyCW5.bat را ببینید.به انتهای این آدرس یک فضای خالی اضافه کرده و نام فایل فهرست (در مثال ما List.txt) را تایپ کنید (توجه کنید که باید این تغییرات را اضافه کنید نه جانشین).چنان نام فایل فهرست شما دارای فضای خالیست،حتما آن ار در یک جفت کوتیشن ("") قرار دهید.
8) بهتر است یک کپی از Short cut ویرایش شده را بر روی Desktop خود قرار داده تا هر گاه از Desktop Wallpaper خود خسته شدید،با اجرای آن،Wallpaper را تغییر دهید!
9) یک بار روی Short cut ایجاد شده Double Click کنید تا مطمئن شوید که درست کار می کند.
10) اگر تمام مراحل را درست انجام داده باشيد،Wallpapre شما در هر بار Log off يا Restart تغيير خواهد کرد.

سئوال: همانطور که در مقدمه آورده اید،این کد ها فقط برای XP نوشته شده است و من در Vista و Windows7 امتحان کردم و جواب نداد! در ضمن هر روز از کاربران XP کم می شود،پس فکر نمی کنید این همه نوشته کار بیهوده است؟
جواب: برای پاسخ سه نکته را یاد آور می شوم:
- اول اینکه،همانطور که قبلا نوشتم،این مسئله بهانه ای است برای کار با خط دستور و نمایش قدرت آن و تاکید بر این موضوع که برای هر کاری نیاز به نصب یک نرم افزار و یا نوشتن یک برنامه با زبانهای همه کاره و .. نیست و می توان یک چنین کاری را (که شاید در نگاه اول از قابلیت های یک ویندوز تازه نصب شده بر نیاید)،به راحتی انجام داد!
- دوم اینکه،هر چند ویندوز های تازه تر به عرصه فناوری آمده است،ولی چیزی فراتر از نو بودن و تازه بودن برای مهاجرت لازم است (به نظر من کسی که یک کاربر حرفه ای XP است و به ویندوز بالاتر مهاجرت می کند،حداقل 40 درصد اطلاعاتش دیگر بدرد نمی خورد و برای برخی کارهای پیش پا افتاده باید کلی جستجو کند - این البته تجربه شخصی خودم است)،دلیل این مدعی هم اینکه در بیشتر ادارات،کافی نت ها،گیم نت ها و .... که به نوعی عمومی تر به مسئله کامپیوتر نگاه می شود،هنوز از XP استفاده می کنند (شاید به نظر کم اطلاعی مسئولین این محیط ها باشد،ولی واقعیت این است که کاربران با XP احساس نزدیکی و راحتی بیشتری دارند و ..).پس این کد ها در محیط های مطرح شده،می تواند به کار رود!
- سوم اینکه،راه حل جاری (ششم)،که ثبت Wallpaper را به یک API محول می کند،در واقع در همه ویندوز ها کار میکند (از 2000 به بالا،حتی من در Windows7 خودم، استفاده می کنم)

استفاده از تمامی مطالب سایت تنها با ذکر منبع آن به نام سایت علمی نخبگان جوان و ذکر آدرس سایت مجاز است

استفاده از نام و برند نخبگان جوان به هر نحو توسط سایر سایت ها ممنوع بوده و پیگرد قانونی دارد