PDA

View Full Version : چطوری این کد رو توی سی شارپ تعریف واستفاده کنم



مهدی رحیم زاده
دوشنبه 12 آذر 1386, 05:36 صبح
سلام.
توی رجیستری، زیر HKEY_CLASSES_ROOT، دنباله فایلها بصورت کلیدهای جداگانه نوشته شده. مثلا .txt نمایانگر فایلهایی با دنباله txt (همون فایلهای text) هستش. اگر Default Value این کلید رو نگاه کنید، یه String میبینید. مثلا تو این حالت txtfile.

این نام کلیدی هستش که باید بهش رجوع کنیم. یعنی باید بریم سراغ کلید زیر:


HKEY_CLASSES_ROOT\txtfile


اگر به این کلید دقت کنید، یه کلید دیگه به اسم DefaultIcon میبینید که Default Value اون، نشون دهنده ICON ای هستش که شما بدنبالش هستید. بسیاری از Icon ها، حاوی همچین مقداری هستن:

%SystemRoot%\system32\shell32.dll,-152

152 نشوندهنده شماره Resource اون آیکون در فایل Shell32.dll هستش. از اینجا به بعد نیاز به Win32 API ها دارید تا بتونید Resource ها رو Extract کنید و شماره مورد نظرتون رو از دل اون فایل بیرون بکشید. متودی که اینکار رو براتون انجام میده، prototype اش اینه:

HICON ExtractIcon(HINSTANCE hInst, LPCTSTR lpszExeFileName, UINT nIconIndex);

کافی هستش که اینو در C#، تعریف کرده و سپس روند توضیح داده شده رو طی کنید تا به Icon مورد نظر برسید.

اینو یکی از دوستامون زحمت کشیدن و برام گذاشتن ولی من نتونستم این کد رو توی سی شارپ تعریف کنم تا بتونم از اون استفاده کنم ، حالا اگر کسی می تونه راهنمایی کنه ...
خیلی ضروری لازمش دارم اینو !!!
ممنون

rohullah
دوشنبه 12 آذر 1386, 10:17 صبح
تو ارتباط با رجیستری و پیدا کردن مقدار مشکل داری یا تو استفده از آیکون داخل یک فایل exe ???

مهدی رحیم زاده
دوشنبه 12 آذر 1386, 16:46 عصر
مشکل من اینجاست که چطوری مثلا بفهمم آیکن فایل های jpg چیه یا مثلا آیکن txt. چیه که بعد اونا رو توی imaglist بزارم و استفاه کنم ...

مهدی رحیم زاده
سه شنبه 13 آذر 1386, 11:51 صبح
کسی نمی خواد راهنمایی کنه ...
واجبه بخدا

PC2st
سه شنبه 13 آذر 1386, 17:46 عصر
اگر مشکل در نحوه استفاده از اون تابع API باشه...

تابع API رو به شکل زیر اعلان میکنیم:


[DllImport("shell32.dll")]
static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);

کد فوق از pinvoke.com کپی/پیست شده!

پارامتر اول برای برنامه های ویندوزی که از جنس Form هستند، باید مقدار this.Handle رو بگیره.
پارامتر دوم هم نام فایل dll و پارامتر سوم هم اندیس آیکونی است که در dll قرار داره.
مقدار بازگشتی از تابع ExtractIcon هم یک handle به آیکون رو برمیگردونه که توسط متد Icon.FromHandle میتونید شیئ Icon اش رو بدست بیارید و تمام.
مثال:


Icon ico = Icon.FromHandle(ExtractIcon(this.Handle, "Package.dll", 0));

مهدی رحیم زاده
چهارشنبه 14 آذر 1386, 20:54 عصر
خوب حالا چطوری بفهمم که شماره index آیکن فایلهای jpg یا مثلا gif چیه ؟؟؟؟
اگه میشه با یک کد کوچولو برام توضیح بدین ...

PC2st
چهارشنبه 14 آذر 1386, 23:16 عصر
برنامه Registry Editor رو باز کرده و به کلید HKEY_CLASSES_ROOT می رویم.

مثلا اگه بخوایم آیکن فایلهای با پسوند jpg رو بفهمیم، باید به کلید زیر برویم:


HKEY_CLASSES_ROOT\.jpg

بعدش به کلید زیر میرویم:


HKEY_CLASSES_ROOT\.jpg\OpenWithProgids

در اینجا، Value Name ها مشخص کننده نام برنامه ایست که میشه فایل jpg رو توسط اون باز کرد. مثلا در سیستم من، تنها یک Value Name بنام jpgfile وجود داره پس در قسمت HKEY_CLASSES_ROOT، بدنبال کلید jpgfile میگردیم و مثلا اون رو پیدا میکنیم پس ادرس به شکل زیر میشه:


HKEY_CLASSES_ROOT\jpegfile

به کلید فوق رفته و زیر کلید DefaultIcon رو باز میکنیم و در قسمت Value Name بدنبال (Default) گشته و مقدار Data همون آیکنی است که به فایل انتساب داده شده.



فایلی مثل bmp رو در نظر میگیریم که آدرس کلید مورد نظر بصورت زیر میشه:


HKEY_CLASSES_ROOT\.bmp\OpenWithProgids

اما در سیستم من دو مقدار در قسمت Value Name وجود داره: Paint.Picture و VisualStudio.bmp.8.0
اگر به زیر کلید زیر بروم، میتونم آیکنش رو تشخیص بدهم:


HKEY_CLASSES_ROOT\Paint.Picture\DefaultIcon

اما زیر کلید زیر، نمیتونه در تشخیص دادن آیکن به من کمکی کنه:


HKEY_CLASSES_ROOT\VisualStudio.bmp.8.0\DefaultIcon

بهرحال خواستم که این رو هم بدونید که معمولا یک مقدار در قسمت Value Name در داخل زیر کلید OpenWithProgids وجود داره اما اگر دو تا یا بیشتر هم وجود داشت، ممکنه به مشکل فوق هم بربخورید که فکر کنم اولین Value Name برای بدست آوردن آیکن کافی باشه.