آموزش WPF

مباحث پایه WPF

مثال های کاربردی WPF

آموزش ساخت برنامه تک نمونه ای (Single Instance App) در WPF

تصویر wpf-single-instance-application_9084 آموزش ساخت برنامه تک نمونه ای (Single Instance App) در WPF

آموزش ساخت برنامه تک نمونه ای (Single Instance App) در WPF

در این بخش آموزش ساخت برنامه تک نمونه ای (Single Instance App) در WPF را برای شما آماده کرده ایم که یک آموزش مناسب و کاربردی است. در ادامه می توانید توضیحات، تصاویر و فیلمی از نتیجه نهایی کار را مشاهده کنید. همچنین سورس کد پروژه نیز به صورت رایگان برای دانلود قرار داده شده است.

توضیحات

منظور از برنامه تک نمونه ای، برنامه ای است که فقط بتوان یک نمونه از آن اجرا کرد. برای مثال برنامه Settings در Windows 10 یا برنامه Task Manager. اگر با این گونه برنامه ها کار کرده باشید احتمالا متوجه شده اید که فقط می توانید یک نمونه از آن ها ایجاد کنید و اگر بخواهید آن ها را دوباره اجرا کنید، همان نمونه قبلی نمایش داده می شود (به عبارت دیگر Activate می شود). ما در این آموزش از کلاس Mutex و متدهای Native برای ساخت چنین برنامه ای استفاده خواهیم کرد.

تصویر wpf-single-instance-application_9084_1 آموزش ساخت برنامه تک نمونه ای (Single Instance App) در WPF

Mutex در سی شارپ

Mutex مکانیسمی است که دسترسی به منابع اشتراکی (Shared Resources) را کنترل می کند. برای مثال فرض کنید ما یک منبع اشتراکی داریم و دو thread به طور همزمان می خواهند به این منبع دسترسی داشته باشند. در این حالت سیستم باید مکانیسمی داشته باشد تا بتواند دسترسی به این منبع را کنترل کند و مطمئن شود که فقط یک thread در یک زمان خاص به آن منبع دسترسی دارد. Mutex همان مکانیسم کنترل کننده است. زمانی که یک منبع در اختیار thread اول باشد و در همان زمان thread دیگری بخواهد به آن منبع دسترسی پیدا کند، Mutex آن thread را به حالت تعلیق در می آورد تا زمانی که کار thread اول با آن منبع تمام شود. این کلاس عملکرد مشابه کلاس Monitor دارد با این تفاوت که Mutex می تواند برای مدیریت منابع اشتراکی بین فرآیندها نیز استفاده شود. برای اطلاعات بیشتر در مورد این کلاس می توانید به لینک زیر مراجعه کنید (C# Mutex Class) .

ساخت پروژه WPF

خوب برای ساخت چنین برنامه ای یک پروژه از نوع WPF (ما اسم پروژه را SingleInstanceApp گذاشته ایم) ایجاد کنید. در این آموزش از ویژوال استودیو 2019 و .Net Core 3.1 استفاده کرده ایم ولی شما می توانید از نسخه های پایین تر نیز استفاده کنید، تفاوت چندانی ندارد و چون .Net Core در حال حاضر جدید ترین نسخه این فریم ورک است سعی کرده ایم آموزشمان به روز باشد. بعد از ایجاد پروژه یک کلاس جدید با نام NativeMethods (می توانید هر اسمی بگذارید ولی این اسم خیلی رایج تر است) به پروژه اضافه کنید. محتوای این فایل را به شکل زیر تغییر دهید.

 این کلاس شامل یک سری اعضای استاتیک است که بخش مهم آن مربوط می شود به خاصیت ReactivationMessage. این خاصیت با استفاده از متد RegisterWindowMessage یک پیام برای زمانی که بخواهیم پنجره اصلی برنامه را Activate کنیم ثبت می کند. این پیام بین فرآیندها ارسال/دریافت می شود. بعد انجام این کار، فایل App.xaml.cs را باز کنید و محتوای آن را به شکل زیر تغییر دهید.

در ابتدا ما یک نمونه استاتیک از کلاس Mutex ایجاد و به عنوان ورودی های سازنده آن یک مقدار بولی و یک رشته ارسال کرده ایم. ورودی اول به Mutex می گوید که اولین تردی که تو را فراخوانی کند، صاحب (Owner) تو خواهد بود (Mutex فقط می تواند یک Owner داشته باشد). ورودی دوم هم نام منحصر به فردی است که به Mutex داده شده است و ما از GUID یا UUID استفاده کرده ایم.

در داخل متد OnStartup میایم بررسی میکنم که آیا منابع مربوط به این فرآیند قبلا استفاده شده است یا خیر. اگر قبلا استفاده نشده باشد، اولین نسخه از پنجره اصلی برنامه را ایجاد و نمایش می دهیم. در غیر این صورت با استفاده از متد PostMessage پیام مربوط به Activate سازی پنجره اصلی که قبلا ایجاد شده است را ارسال می کنیم و نمونه جاری را که قصد اجرا شدن داشت را می بندیم.

حال فایل MainWindow.xaml.cs را باز کنید و محتوای آن را به شکل زیر تغییر دهید.

در کد فوق ما چند متد ایجاد کرده ایم که هر کدام را توضیح می دهم.

  • متد RegisterWndProcCallback: این متد هندل مربوط به پنجره جاری را می گیرد و متد WndProc را به عنوان Callback برای پردازش پیام های دریافتی به این پنجره ثبت می کند.
  • متد ReactivateMainWindow: مسئولیت این متد Activate کردن پنجره اصلی مربوط به برنامه است.
  • متد WndProc: این متد پیام های ارسال شده به پنجره جاری را دریافت و پردازش می کند. اگر پیام دریافت شده مربوط به Activate کردن پنجره باشد (همان پیامی که در فایل App.xaml.cs ارسال می کنیم)، متد مربوط به Activate سازی را فراخوانی می کند.

کدهای XAML را قرار نمی دهم زیرا تاثیری در عملکرد برنامه ندارند و فقط چند پیام ساده را نمایش می دهند. حال پروژه را Build کرده و سعی کنید چند نمونه از برنامه ایجاد کنید تا نتیجه نهایی را مشاهده کنید.

سورس کامل پروژه در GitHub

 

ثبت نظر
ریفریش کنید!
نظرات کاربران (۰ مورد)

هیچ نظری ثبت نشده است