ايران ويج

نسخه‌ی کامل: قرار دادن آیکن برنامه در SysTray
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
عنوان تاپیک تکراری به نظر میاد اما ...

شاید شما بلد باشید که برای برنامتون یه آیکن بذارید توی Taskbar Tray و اگر هم بلد نبودید مثل من از کدهای آماده استفاده می کنید. مثلا من از نمونه برنامه API-Guide استفاده کردم.
اما توی این مطلب می خوام به نکاتی اشاره کنم که شخصاً باهاشون مشکل داشتم. همین ابتدا بگم که بجای اصطلاح Tray از کلمه سینی استفاده می کنم تا موقع تایپ راحت تر باشم.
کد:
#define     سینی      tray
اولین مشکلی که بهش برخوردم این بود که به دلایلی می بایستی BorderStyle فرم های برنامه برابر صفر باشه (None) در حالی که اگر به فرم منو اضافه می کردم حتی با وجود مخفی بودن منو (Visible = False) قالب فرم خراب می شد.

مشکل دوم Right-To-Left بود.

مسئله بعد: منویی که با راست کلیک روی آیکن برنامه تو سینی ظاهر میشه باید یک گزینه Default داشته باشه که Bold هست. این همون گزینه ای هست که وقتی کاربر روی آیکن برنامه توی سینی دوبار کلیلک میکنه اجرا میشه. پس میخوایم یکی از گزینه های منو Bold باشه.

و اما مسائل مهم تر: منویی که با راست کلیک ظاهر میشد خیلی سیریش بود و با زدن Escape و کلیک کردن روی Desktop و روی پنجره های دیگه مخفی نمی شد و حتما می بایست یکی از گزینه هاش کلیک می شد. در حالی که اگه شما همین الان با ویژوال بیسیک یه فرم درست کنید و توش یک منو رو PopUp کنید اون منو خیلی راحت با کلیک کردن تو یه جای دیگه از صفحه نمایش و یا با زدن کلید Escape مخفی میشه. (راه حل: از SetForegroundWindow استفاده کنید)

مورد بعد این بود که من خودم با کلیک چپ خیلی راحت تر هستم تا با کلیک راست. یعنی دوست دارم آیکنهای موجود در سینی طوری باشند که با یک کلیک (چپ) منوی مربوطه شون ظاهر بشه.
اما وقتی کاربر کلیک چپ می کنه آیا باید منو ظاهر بشه یا صبر کنیم ببینیم هدفش دوبار کلیک بوده یا نه؟
آخه ممکنه با فاصله کمی از کلیک چپ قبلی یک بار دیگه کلیک چپ کنه و تبدیل به دوبار کلیک بشه و اگر دوبار کلیک بشه، بجای ظاهر کردن منو باید گزینه Default رو (که معمولا فرم اصلی رو بالا میاره) اجرا کنیم. پس وقتی کلیک چپ روی آیکن برنامه اتفاق می افته، به اندازه زمان دابل کلیک که توی تنظیمات ماوس در ControlPanel قابل دسترسی هست باید صبر کنیم. این زمان رو با تابع GetDoubleClickTime بدست میاریم.

یه مورد دیگه اینکه وقتی فرم از تو سینی بالا میاد حالت خشک شده (یا فریز شده) داشت و بایستی یه کلیک روی فرم بکنیم تا فرم به حالت عادی برگرده.

یه نکته ظریف دیگه:
وقتی برنامه به سینی میره باید فوکوس رو به Taskbar بدیم. اینجوری اگه کاربر بلافاصله بعد از فرستادن برنامه به سینی دوبار کلیک کنه بازهم برنامه درست عمل خواهد کرد.

راستی اگه یه برنامه تو سینی باشه و دوباره همون برنامه رو اجرا کنید چه انتظاری دارید؟ تو برنامه نمونه این انتظار برآورده شده.

حالا به راه حل های مسائل بالا می پردازیم.

ما (شاید هم فقط من) عادت داریم که کدهای مربوط به آیکن موجود در سینی رو توی یکی از فرم های برنامه بذاریم و منوی مربوط به آیکن رو هم تو همون فرم درست کنیم و مخفیش بکنیم (Visible = False). چون وجود منو حتی در حالت مخفی روی قاب فرم (BorderStyle) اثر میذاشت من یک فرم دیگه به پروژه اضافه کردم و منو و کدهای مربوطه رو توی اون فرم گذاشتم. این فرم ابتدای برنامه Load میشه و هنگام خروج از فرم اصلی Unload میشه ولی هیچوقت نمایش داده نمیشه.

مشکل Right-To-Left چجوری حل شد؟
یک منو توی فرمتون ایجاد کنید که قراره تو رویداد Form_MouseUp اون منو رو PopUp کنیم.
برای راست به چپ شدن منو باید خاصیت Right-To-Left مربوط به Form رو True کنید.
چون منو از نوع PopUp هست پس Visible منو رو False می کنیم تا فقط موقع کلیک کردن روی فرم ظاهر بشه. اما وقتی روی فرم کلیک می کنید می بینید با اینکه Form.RightToLeft = True کردید ولی منوتون چپ به راست ظاهر میشه. علتش اینه که Menu.Visible = False هست.
شما اگه یه فرم جداگانه برا منوهاتون به پروژه اضافه کنید (برخلاف عادتی که گفتم) و اون فرم اصلا به چشم کاربر دیده نشه پس نیازی به مخفی کردن منو نیست و همین که Form.RightToLeft = True و Menu.Visible = True باشه دیگه منوتون راست به چپ ظاهر میشه.

مورد بعد Bold کردن گزینه ای بود که گزینه پیش فرض در نظر گرفته شده. به پارامترهای روال PopUp توجه کنید:
کد:
Sub PopupMenu(Menu As object, [Flags], [X], [Y], [DefaultMenu])
معمولاً X و Y و Flags رو مقدار نمیدیم تا منو در محل ماوس ظاهر بشه. پارامتر آخر هم که اصلا به چشم نمیاد و کمتر کسی ازش استفاده می کنه. منظور من هم همین پارامتر آخر بود (DefaultMenu). منویی را که به پارامتر آخر می دهید Bold خواهد شد.
مثال: فرض کنید منویی به اسم mnuPopUp با سه زیر منو به نام های SubItems یک تا سه داریم.
کد:
frmTray.PopupMenu mnuPopUp, , , , SubItems1
پارامتر آخر رو SubItems1 دادم تا بصورت پررنگ ظاهر بشه. مثل گزینه Close از منوی سیستم. همین الان Alt+Space رو بزن تا منوی سیستم رو ببینی.

پس تا اینجا یه فرم جداگانه برای منوی PopUp مربوط به آیکن برنامه توی سینی Taskbar درست کردیم (به اسم frmTray) و RightToLeft فرم رو True کردیم و منوهای مورد نظر رو با Caption های فارسی ایجاد کردیم بدون اینکه Visible شون رو False کنیم.

بریم برای ایجاد آیکن توی سینی.
میدونید که برای این کاریه PictureBox و یه Icon لازمه. جهت صرفه جویی Icon رو توی همون PictureBox ی بذارید که برای تشخیص کلیک کاربر توی سینی ازش استفاده می کنید. طبق مثال اسمش میذاریم picHook
یه سری کد برای گذاشتن آیکن برنامه توی سینی لازمه. تا همین جا هم خیلی حرف زدم پس کدها رو تو فایل ضمیمه ببینید.

لطفا کدهای برنامه ضمیمه رو با دقت مطالعه کنید و عملکرد آیکن برنامه توی سینی سیستم رو با سایر آیکن های موجود در سینی مقایسه کنید. هیچ کد اضافه ای نوشته نشده و برای استفاده از کدها در برنامه های خودتان فقط باید منوی مربوط به فرم frmTray رو تغییر بدید.

اگه مفید بود پس 034

اگر هم صلاح دونستید به تاپیکهای مشابه منتقل کنید.