كيف يمكنني إجراء تطبيق .NET Windows Forms يعمل فقط في علبة النظام؟

StackOverflow https://stackoverflow.com/questions/995195

  •  13-09-2019
  •  | 
  •  

سؤال

ماذا أحتاج أن أفعل لجعل نماذج ويندوز تشغيل التطبيق في علبة النظام؟

ليس تطبيق يمكن أن يقلل من الدرج، ولكن واحد موجود فقط في الدرج، مع عدم وجود أيقونة، طرف الأداة، وقائمة "انقر بزر الماوس الأيمن".

هل كانت مفيدة؟

المحلول

الجواب الأساسي من استخدام notifyicon هو الصحيح ولكن، مثل العديد من الأشياء .NET، هناك مجموعة من التفاصيل الدقيقة المعنية في القيام بذلك حق. وبعد البرنامج التعليمي الذي ذكره براد يعطي المشي جيدا من الأساسيات للغاية، ولكن لا يعالج أي من هذه:

  • هل يغلق التطبيق من علبة النظام بإغلاق أي أشكال الطفل المفتوحة؟
  • هل يقوم التطبيق بتنفيذ أنه قد يعمل مثيل واحد فقط من نفسه (ينطبق على معظم، على الرغم من أن تطبيقات Tray)؟
  • كيفية فتح نوافذ WPF الطفل بالإضافة إلى نوافذ الأطفال WinForms، إذا رغبت في ذلك.
  • كيفية دعم قوائم السياق الديناميكي.
  • توجد Notifyicon القياسية في مساحة WinForms؛ هل يمكنني القيام بحل WPF نقي؟ (نعم يمكنك!)

لقد عرضت للتو من المقالة المنشورة على Simple-Talk.com التي تعالج هذه النقاط وأكثر بتفصيل كبير، مما يوفر إطارا للتطبيقات من الدرج التي يمكنك استخدامها على الفور، بالإضافة إلى تطبيق مثالي كامل للعالم لإظهار كل شيء في الممارسة العملية. يرى إنشاء تطبيقات صينية في .NET: دليل عملي, ، نشر نوفمبر 2010.

نصائح أخرى

مقالة مشروع القانون إنشاء تطبيق المهام يعطي شرح بسيط للغاية ومثال على إنشاء تطبيق موجود فقط في علبة النظام.

تغيير أساسا Application.Run(new Form1()); في الخط Program.cs بدلا من ذلك بدء الفصل الذي يرث من ApplicationContext, ، ولدي منشئ لهذا الفصل تهيئة NotifyIcon

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.Run(new MyCustomApplicationContext());
    }
}


public class MyCustomApplicationContext : ApplicationContext
{
    private NotifyIcon trayIcon;

    public MyCustomApplicationContext ()
    {
        // Initialize Tray Icon
        trayIcon = new NotifyIcon()
        {
            Icon = Resources.AppIcon,
            ContextMenu = new ContextMenu(new MenuItem[] {
                new MenuItem("Exit", Exit)
            }),
            Visible = true
        };
    }

    void Exit(object sender, EventArgs e)
    {
        // Hide tray icon, otherwise it will remain shown until user mouses over it
        trayIcon.Visible = false;

        Application.Exit();
    }
}

كما يقول mat1t - تحتاج إلى إضافة notifyicon إلى طلبك، ثم استخدم شيئا مثل التعليمات البرمجية التالية لتعيين قائمة أدوات الأدوات والسياق:

this.notifyIcon.Text = "This is the tooltip";
this.notifyIcon.ContextMenu = new ContextMenu();
this.notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Option 1", new EventHandler(handler_method)));

يوضح هذا الرمز الأيقونة في علبة النظام فقط:

this.notifyIcon.Visible = true;  // Shows the notify icon in the system tray

ستكون هناك حاجة لما يلي إذا كان لديك نموذج (لأي سبب من الأسباب):

this.ShowInTaskbar = false;  // Removes the application from the taskbar
Hide();

يتم التعامل مع النقر المناسب للحصول على قائمة السياق تلقائيا، ولكن إذا كنت ترغب في القيام ببعض الإجراءات على النقر الأيسر، فستحتاج إلى إضافة معالج نقرة:

    private void notifyIcon_Click(object sender, EventArgs e)
    {
        var eventArgs = e as MouseEventArgs;
        switch (eventArgs.Button)
        {
            // Left click to reactivate
            case MouseButtons.Left:
                // Do your stuff
                break;
        }
    }

لقد كتبت تطبيق Traybar مع .NET 1.1 ولم أكن بحاجة إلى نموذج.
بادئ ذي بدء، قم بتعيين كائن بدء التشغيل للمشروع كسلع Main, ، المعرفة في وحدة نمطية.
ثم قم بإنشاء المكونات برمجيا: NotifyIcon و ContextMenu.
تأكد من تضمين MenuItem "إنهاء" أو ما شابه ذلك.
ارتباط ContextMenu إلى NotifyIcon.
يستحضر Application.Run().
في معالج الأحداث للاستقالة MenuItem تأكد من استدعاء مجموعة NotifyIcon.Visible = False, ، من ثم Application.Exit()وبعد أضف ما تحتاجه إلى ContextMenu والتعامل بشكل صحيح :)

  1. إنشاء تطبيق Windows جديد مع المعالج.
  2. حذف Form1 من التعليمات البرمجية.
  3. إزالة الرمز في البرامج. Form1.
  4. استخدم ال NotifyIcon فئة لإنشاء أيقونة علبة النظام (تعيين أيقونة لذلك).
  5. إضافة سياق إلى ذلك.
  6. أو رد فعل ذلك NotifyIcon"MouseClick ومخففة بين النقر الصحيح واليسار، تعيين السياق الخاص بك وأظهرته على أي وقت مضى زر (يمين / يسار) مضغوطا.
  7. Application.Run() للحفاظ على التطبيق يعمل مع Application.Exit() ليستقيل. أو أ bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}. وبعد ثم تعيين bRunning = false; للخروج من التطبيق.

تطبيق "علبة النظام" هو مجرد تطبيق نماذج فوز منتظمة، والفرق الوحيد هو أنه يخلق أيقونة في منطقة علبة نظام Windows. لإنشاء أيقونة SYS.TRAY استخدم مكون Notifyicon، يمكنك العثور عليه في مربع الأدوات (عناصر تحكم شائعة)، وتعديل خصائصها: أيقونة، نصيحة أداة. كما أنه تمكنك من التعامل مع انقر فوق الماوس والرسائل النقر المزدوجة.

وأشيء آخر، من أجل تحقيق نظرة ويشعر أو تطبيق صينية قياسي. إضافة خطوط Followinf في حدث نموذجي الخاص بك:

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 

بقدر ما أدرك أن عليك أن تظل كتابة التطبيق باستخدام نموذج، ولكن ليس لديك أي عناصر تحكم في النموذج وعدم تعيينه مرئيا. استخدم Notifyicon (نموذج MSDN الذي يمكن العثور عليه هنا) لكتابة طلبك.

وهنا كيف فعلت ذلك Visual Studio 2010., .NET 4.

  1. إنشاء تطبيق Windows Forms، تعيين "جعل تطبيق مثيل واحد" في الخصائص
  2. إضافة contextmenustrip.
  3. إضافة بعض الإدخالات إلى شريط قائمة السياق، انقر نقرا مزدوجا عليها للحصول على المعالجين، على سبيل المثال، "خروج" (انقر نقرا مزدوجا) -> معالج -> Me.Close ()
  4. أضف Notifyicon، في المصمم تعيين ContextMenustrip إلى الشخص الذي أنشأته للتو، اختر أيقونة (يمكنك العثور على بعض في مجلد VisualStudio ضمن "Common7 ...")
  5. تعيين خصائص للنموذج في المصمم: Formborderstyle: لا شيء، Showicon: False، ShowinTaskBar: False، العتامة: 0٪، WindowState: minimized
  6. أضفني. كنترول + فاتورة غير مدفوعة
  7. تشغيل وضبط حسب الحاجة.

إنه إطار ودود للغاية لتطبيق منطقة الإعلام ... يكفي لإضافة إعلام للحصول على نموذج أساسي وتغيير التعليمات البرمجية التي تم إنشاؤها تلقائيا إلى الرمز أدناه:

public partial class Form1 : Form
{
    private bool hidden = false;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.ShowInTaskbar = false;
        //this.WindowState = FormWindowState.Minimized;
        this.Hide();
        hidden = true;
    }

    private void notifyIcon1_Click(object sender, EventArgs e)
    {
        if (hidden) // this.WindowState == FormWindowState.Minimized)
        {
            // this.WindowState = FormWindowState.Normal;
            this.Show();
            hidden = false;
        }
        else
        {
            // this.WindowState = FormWindowState.Minimized;
            this.Hide();
            hidden = true;
        }
    }
}

ببساطة إضافة

this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;

إلى كائن النموذج الخاص بك. سوف ترى أيقونة فقط في علبة النظام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top