PDA

View Full Version : مقاله: اطلاعاتی در مورد Handle Property در دات نت و سیستم عامل ویندوز



mosini
دوشنبه 04 خرداد 1388, 13:54 عصر
منظور از پراپرتی Handle در .Net و کلا در محبث سیستم عامل ویندوز وAPI های مربوطه چیست؟
تمام کنترل ها و خود فرم در .net شامل پراپرتی ای بنام Handle است.Handle متغیری از نوع IntPtr است.
نوع داده ای IntPtr نوع داده ای است که در پردازنده های 32 بیتی حجمی معادل 32 بیت می گیرند و در پردازنده های 64 بیتی حجمی معادل 64 بیت می گیرند.handle مقدارش در موقع اجرا unique و منحصر به فرد است.یعنی برای دو کنترل نمی توان یک handle اختصاص داد.
کلا در محیط ویندوز هر پنجره ای که باز می شود به آن عددی منحصر به فرد داده می شود(این عدد در متغیر handle ذخیره میشه) و بعد سیستم عامل هنگامی که کاربر قصد خروج یا minimize یا عملیات دیگر روی پنجره ای باز انجام دهد ، بر اساس این handle پی میبرد که کدام پنجره را تحت تاثیر قرار دهد.
همونطور که میدونید عملیاتی که روی پنجره ها انجام میشه توسط api ها انجام میشه.این گونه api مقدار متغیر handle رو می خوان.
این مقاله کوچیک رو شرح دادم تا اگه توی دات نت با دستوری مثل This.Handle بر خوردید بدونید که handle چیه و چی کارس.
در ادامه مثالی با یه api ویندوز ،در C# مثالی ارائه می کنم که بدونید handle توی دات نت کجا بکار میره.
خوشحال میشم نظرتون رو راجع به کیفیت مطلب و سطح مقاله(ضعیف ،خوب،عالی) بدهید.موفق باشید.

Delta_programer
دوشنبه 04 خرداد 1388, 15:51 عصر
با سلام وتشکر از مقاله شما
خلاصه نویسی در مقاله ها که باعث بشه هدف را برسونه خیلی عالیه ولی کم نویسی هم مطلب را نمی رسونه معمولا با مثال و توضیح کاربردی بیشتر به دیگران کمک می کنه
با تشکر مجدد از دوست عزیز

mosini
سه شنبه 05 خرداد 1388, 13:55 عصر
با سلام وتشکر از مقاله شما
خلاصه نویسی در مقاله ها که باعث بشه هدف را برسونه خیلی عالیه ولی کم نویسی هم مطلب را نمی رسونه معمولا با مثال و توضیح کاربردی بیشتر به دیگران کمک می کنه
با تشکر مجدد از دوست عزیز

با شما موافقم
handle متغیری است که سیستم عامل ویندوز از آن جهت شناسایی شی های فعال استفاده میکنه.این شی میتونه یه فرم ویندوزی یا یک کنترل تو دات نت باشه.مثلا هر پنجره ویندوزی(مثل my computer) اگه فعال شده باشد(باز شده باشد و فوکوس روی ان باشد) شامل یه عدد منحصر به فردی است که نام اون رو سیستم عامل ویندوز گذاشته windows handle و در واقع این عدد موجب شناسوندن mycomputer به سیستم عامل ویندوز است که سیستم عامل بفهمد از بین پنجره های باز شده کدام الان فعال است.
در حقیقت هر پنجره ویندوزی که در سیستم عامل ویندوز باز میشود به آن یه windows handle یا همون شماره شناسایی منحصر به فردی داده میشود.تا بعدا این handle یا windows handle توسط api های ویندوز که نقش اساسی را بازی میکنند مورد استفاده قرار بگیرد.
مثلا برای بستن یه پنجره فعال با کلیک روی علامت ضربدر آن در خقیقت یه تابعی بنام DestroyWindow که در api ای بنام user32.dll وجود دارد اجرا میشه که این تابع بعنوان ورودی از سیستم عامل یا کسی که اونو اجرا میکنه همون شماره شناسایی یا windows handle رو میخواد.سینتکس این تابع رو ببینید:

BOOL DestroyWindow(HWND hWnd);

همونطور که میبینید یه پارامتر ورودی از نوع HWND یا handle to window یا همون window handle خودمون رو میگیر.خیلی منطقیه ، این تابع باید بدونه کدون پنجره را از بین پنجره های موجود ببنده.
توی دات نت شی های ساخته شده از فرم ها و کنترل ها که دارای پراپرتی handle هستند ،در واقع شماره handle ساخته شده توسط سیستم عامل برای اون فرممون یا کنترلمون را در بر دارند.
اگر دقت کنید میبینید همه ی این شی ها دارای متد dispose هستند.این متد با استفاده از این handle اون فرم یا کنترل را میبنده و یا منابع در اختیارش رو میگیره.dispose خودش در عمل DestroyWindows رو برای بستن پنجره های(فرمهای ما) در دات نت صدا میزنه.حالا اگه شما سرتون درد میکنه برای اثبات این موضوع بیابید باهم اونو پیاده سازی کنیم:
قبل از خوندن ادامه باید با نحوه استفاده از dll ها یا همون api های ویندوز در سی شارپ یا دات نت آشنا باشین اگه نیستین به مقاله خودم در این رابطه در اینجا (http://barnamenevis.org/forum/showthread.php?t=161039) رجوع کنید، بعدش بیایید تا سرتون درد بگیره!:لبخند:
خب یه پروژه windows application بسازید.بعد یه دکمه روی فرمتون قرار بدید .می خواهیم با کلیک روی این دکمه فرممون بسته بشه.(البته نه با نوشتن this.Close بلکه با استفاده از api موجود (user32.dll) و عامل این کار یعنی DestroyWindow).پس دست به کار شید:
در داخل کلاس form1 مون باید از Dllimport برای شناسوندن user32.dll استفاده کنیم.امید واردم مقاله ای که معرفی کردم رو خونده باشین چون حسش نیست در مورد این مطلب اینجا توضیح بدم.خب من این طوری از dllimport استفاده کردم:

[System.Runtime.InteropServies.DllImport("user32.dll")]
public static extern void DestroyWindow(IntPtr handle);


ممکنه بگید چرا نوع داده ای handle رو IntPtr گذاشتم؟
چونکه این عدد منحصر به فرم در سیستم های مختلف از لحاض سخت افزاری ، نمایش مقادیر را در فرمت های مختلف نشون میده.اینطوری بگم فرمت خروجی(الگوی بیتی) یا انگلیسیش میشه bit pattern این عدد توی بعضی سیستم ها ممکنه 32 بیتی باشه ، بعضی ممکنه 64 بیتی باشه، (یعنی نمایش یک عدد با 32 بیت یا 64 بیت)برای همین نوع داده ای handle رو IntPtr گزاشتیم.همونطور که میدونید IntPtr سایزش از نظر بیتی بستگی داره به سیستمی که درونش مورد استفاده قرار گرفته، مثلا توی سیستم های 32 بیتی ، 32 بیتی میشه و توی 64بیتی ها به شکل 64 بیتی در میاد.


حال روی دکمه دو بار کلیک کنید تا وارد متد مدیریت رویداد click دکمه مون بشیم.و بنویسید:

DestroyWindow(this.Handle);

حالا برنامه را اجرا کنید.با اجرا یه پنجره ویندوزی اجرا میشهپس به اون یه handle داده میشه.این handle توی this.Handle ذخیره میشه.حال با کلیک روی دکمه شاهد بسته شدن فرم هستید.
نظرتون رو راجه به کیفیت مقاله بدین.ممنون
موفق باشید

Delta_programer
چهارشنبه 06 خرداد 1388, 15:56 عصر
با سلام
سئوالی که برایم پیش آمد این است که چطوری می شه فهمید این عدد مربوط به کدام برنامه است یا اینکه اعداد چگونه تقسیم می شوند و هر برنامه چه عددی داره آیا این اعداد برای برنامه های ثابت است؟
از راهنماییهای شما کمال تشکر را دارم