ما هي الطريقة الصحيحة للتصغير إلى تطبيق C# WinForms؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

ما هي الطريقة الصحيحة لتصغير تطبيق WinForms إلى علبة النظام؟

ملحوظة:تصغير ل علبة النظام;على الجانب الأيمن من شريط المهام بجوار الساعة.أنا لا أسأل عن التصغير إلى شريط المهام، وهو ما يحدث عندما تضغط على زر "ناقص" في النافذة.

لقد رأيت حلولاً اختراقية مثل "التصغير، وتعيين ShowInTaskbar = false، ثم إظهار NotifyIcon الخاص بك".

تعد مثل هذه الحلول اختراقًا لأن التطبيق لا يبدو أنه يتم تصغيره إلى الدرج مثل التطبيقات الأخرى، ويجب أن يكتشف الكود متى يتم تعيين ShowInTaskbar = true، من بين مشكلات أخرى.

ما هي الطريقة الصحيحة للقيام بذلك؟

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

المحلول

لا توجد في الواقع طريقة مُدارة للقيام بهذا النوع من الرسوم المتحركة على الدرج في ملفات winforms الأصلية، ومع ذلك يمكنك استخدام P/Invoce shell32.dll للقيام بذلك:

بعض المعلومات الجيدة هنا (في التعليقات وليس المنشور):

http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx

وهنا في C++:

http://www.codeproject.com/KB/shell/minimizetotray.aspx

يمكنك استخدام ذلك لمعرفة الأشياء التي يجب عليك Pinvoc لإصدار C# الخاص بك.

نصائح أخرى

this.WindowState = FormWindowState.Minimized  

هذه هي الطريقة المدمجة للقيام بذلك ويبدو الأمر جيدًا بالنسبة لي في معظم الأوقات.المرة الوحيدة التي بها بعض الغرابة هي إذا قمت باستدعائها عند بدء التشغيل والتي تحتوي على بعض الغرابة في بعض الأحيان ولهذا السبب سيقوم معظم الأشخاص أيضًا بتعيين ShowInTaskbar = false وإخفاء النموذج أيضًا.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowstate.aspx

وسوف يساعد:

public partial class Form1 : Form
{
    public static bool Close = false;
    Icon[] images;
    int offset = 0;

    public Form1()
    {
        InitializeComponent();

        notifyIcon1.BalloonTipText = "My application still working...";
        notifyIcon1.BalloonTipTitle = "My Sample Application";
        notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; 
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (FormWindowState.Minimized == WindowState)
        {
            this.Hide();
            notifyIcon1.ShowBalloonTip(500);
            //WindowState = FormWindowState.Minimized;
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        this.Show();
        notifyIcon1.ShowBalloonTip(1000);
        WindowState = FormWindowState.Normal;
    }

    private void maximizeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        this.Show();
        WindowState = FormWindowState.Normal;
    }

    private void closeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Close = true;
        this.Close();  
    }

    // Handle Closing of the Form.
    protected override void OnClosing(CancelEventArgs e)
    {
        if (Close)
        {
            e.Cancel = false;
        }
        else
        {
            WindowState = FormWindowState.Minimized;
            e.Cancel = true;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Load the basic set of eight icons.
        images = new Icon[5];
        images[0] = new Icon("C:\\icon1.ico");
        images[1] = new Icon("C:\\icon2.ico");
        images[2] = new Icon("C:\\icon3.ico");
        images[3] = new Icon("C:\\icon4.ico");
        images[4] = new Icon("C:\\icon5.ico");
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        // Change the icon.
        // This event handler fires once every second (1000 ms).
        if (offset < 5)
        {
            notifyIcon1.Icon = images[offset];
            offset++;
        }
        else
        {
            offset = 0;
        }
    }
}

تم اختبار هذا الرمز ويدعم العديد من الخيارات.

المزيد هنا: http://code.msdn.microsoft.com/TheNotifyIconExample

تحديث:يبدو أنني نشرت في وقت مبكر جدا.كنت أستخدم أيضًا الاختراق أدناه لأداة خاصة بي.في انتظار الحل المناسب لذلك ...........

يمكنك استخدام Windows.Forms.NotifyIcon لهذا الغرض. http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

أضف NotifyIcon إلى النموذج، وقم بتعيين بعض الخصائص، وبذلك تكون قد انتهيت.

        this.ShowIcon = false;//for the main form
        this.ShowInTaskbar = false;//for the main form
        this.notifyIcon1.Visible = true;//for notify icon
        this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));//set an icon for notifyicon

    private void Form1_Shown(object sender, EventArgs e)
    {
        this.Hide();
    }

مماثلة لما سبق ...

لدي معالج حدث لتغيير الحجم يتم تشغيله عندما يتم تغيير حجم النافذة (تكبير، تصغير، وما إلى ذلك)...

    public form1()
    {
       Initialize Component();

       this.Resize += new EventHanlder(form1_Resize);
    } 


    private void form1_Resize(object sender, EventArgs e)
    {
       if (this.WindowState == FormWindowState.Minimized && minimizeToTrayToolStripMenuItem.Checked == true)
       {
             NotificationIcon1.Visible = true;
             NotificationIcon1.BalloonTipText = "Tool Tip Text"
             NotificationIcon1.ShowBalloonTip(2);  //show balloon tip for 2 seconds
             NotificationIcon1.Text = "Balloon Text that shows when minimized to tray for 2 seconds";
             this.WindowState = FormWindowState.Minimized;
             this.ShowInTaskbar = false;
       }
    }

يتيح ذلك للمستخدم تحديد ما إذا كان يريد التصغير إلى الدرج عبر شريط القائمة أم لا.يمكنهم الانتقال إلى Windows -> والنقر على Minimize to Tray.إذا تم التحقق من ذلك ، وتم تغيير حجم النافذة لتقليلها ، فسيتم تقليلها إلى الدرج.يعمل لا تشوبه شائبة بالنسبة لي.

في منشئ النموذج:

this.Resize += new EventHandler(MainForm_Minimize);

ثم استخدم طريقة معالج الأحداث هذه:

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

إذا كنت تواجه مشكلات في تشغيل هذا، فتأكد من وجودها لديك

this.Resize += new System.EventHandler(this.Form1_Resize);

في fom1.designer.cs

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