ย่อขนาดแอปลงในถาดระบบ


114

ฉันมีแอพฟอร์ม Windows ที่ขับเคลื่อนโดย C # และ Visual Studio 2010

ฉันจะย่อขนาดแอปลงในถาดระบบ (ไม่ใช่แถบงาน) จากนั้นนำกลับมาเมื่อดับเบิลคลิกในถาดระบบได้อย่างไร ความคิดใด นอกจากนี้ฉันจะสร้างเมนูในไอคอนในถาดระบบได้อย่างไรและเมื่อฉันคลิกขวามันจะแสดงเมนูเช่นเข้าสู่ระบบ, ยกเลิกการเชื่อมต่อ, เชื่อมต่ออะไรทำนองนั้น นอกจากนี้ยังมีวิธีใดบ้างที่จะแสดงเหมือนลูกโป่งที่โผล่ขึ้นมาจากถาดระบบ?

PS: ฉันได้เพิ่ม alertIcon แล้ว แต่ฉันไม่รู้วิธีใช้


ที่นี่คุณสามารถดาวน์โหลดโค้ดตัวอย่างที่ยอดเยี่ยมsimple-talk.com/dotnet/.net-framework/…
Developer

คุณจะต้องแน่ใจว่าได้เข้าไปที่ Designer.cs ของแบบฟอร์มและ "ลงทะเบียน" ตัวจัดการเหตุการณ์ไม่เช่นนั้นสิ่งเหล่านี้จะทำงานไม่ได้ (ฉันคิดไม่ออก) คุณสามารถทำได้โดยเพิ่มสิ่งนี้: this.Resize + = new System.EventHandler (this.ManagementForm_Resize);
Brad

คำตอบ:


149

จัดการเหตุการณ์ Resize ของแบบฟอร์ม ในตัวจัดการนี้คุณจะแทนที่ฟังก์ชันการทำงานพื้นฐานของเหตุการณ์ Resize เพื่อทำให้แบบฟอร์มย่อเล็กสุดลงในถาดระบบไม่ใช่ที่แถบงาน สามารถทำได้โดยทำสิ่งต่อไปนี้ในตัวจัดการเหตุการณ์ Resize ของฟอร์มของคุณ: ตรวจสอบว่าคุณสมบัติ WindowState ของฟอร์มถูกตั้งค่าเป็น FormWindowState.Minimized หรือไม่ ถ้าใช่ให้ซ่อนแบบฟอร์มของคุณเปิดใช้งานวัตถุ NotifyIcon และแสดงปลายบอลลูนที่แสดงข้อมูลบางอย่าง เมื่อ WindowState กลายเป็น FormWindowState.Normal ให้ปิดการใช้งานวัตถุ NotifyIcon โดยตั้งค่าคุณสมบัติ Visible เป็นเท็จ ตอนนี้คุณต้องการให้หน้าต่างปรากฏขึ้นอีกครั้งเมื่อคุณดับเบิลคลิกที่วัตถุ NotifyIcon ในแถบงาน สำหรับสิ่งนี้จัดการเหตุการณ์ MouseDoubleClick ของ NotifyIcon ที่นี่คุณแสดงแบบฟอร์มโดยใช้วิธี Show ()

private void frmMain_Resize(object sender, EventArgs e)
{
    if (FormWindowState.Minimized == this.WindowState)
    {
       mynotifyicon.Visible = true;
       mynotifyicon.ShowBalloonTip(500);
       this.Hide();
    }

    else if (FormWindowState.Normal == this.WindowState)
    {
       mynotifyicon.Visible = false;
    }
}

5
คุณสามารถเปลี่ยน Form.FormBorderStyle Property msdn.microsoft.com/en-us/library/…
CD ..

TNX! มันใช้งานได้ .. ยังมีความคิดที่จะปิดการใช้งานปุ่มย่อเล็กปิดและขยายใหญ่สุดที่ด้านบนขวาหรือไม่? tnx
WantIt


tnx ก็ใช้ได้เหมือนกัน! นอกจากนี้เมื่อฉันคลิกสองครั้งที่ไอคอนในซิสเต็มเทรย์หน้าต่างไม่ได้อยู่ด้านบนพร้อมกับแอปพลิเคชันอื่นฉันต้องใช้ความพยายามโดยคลิกที่หน้าต่างในแถบงานเพื่อให้หน้าต่างปรากฏขึ้น เราจะจัดการกับเรื่องนี้ได้อย่างไร? tnx มาก
WantIt


69

ฉันพบว่าสิ่งนี้ทำให้วิธีแก้ปัญหาทั้งหมดสำเร็จ คำตอบข้างต้นไม่สามารถลบหน้าต่างออกจากแถบงานได้

private void ImportStatusForm_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        notifyIcon.Visible = true;
        notifyIcon.ShowBalloonTip(3000);
        this.ShowInTaskbar = false;
    }
}

private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = true;
    notifyIcon.Visible = false;
}

นอกจากนี้ยังเป็นการดีที่จะตั้งค่าคุณสมบัติต่อไปนี้ของตัวควบคุมไอคอนการแจ้งเตือนโดยใช้ตัวออกแบบฟอร์ม

this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't think there is an error.
this.notifyIcon.BalloonTipText = "[Balloon Text when Minimized]";
this.notifyIcon.BalloonTipTitle = "[Balloon Title when Minimized]";
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); //The tray icon to use
this.notifyIcon.Text = "[Message shown when hovering over tray icon]";

7
คุณพลาดthis.Show();มาก่อนthis.WindowState = FormWindowState.Normal;
developerwjk

1
พิมพ์ผิดใน "ผู้ใช้ไม่เข้าใจ" ;)
แอนดรู

1
@developerwjk ก็ไม่หายเพราะเขาไม่โทรHide(). แต่ปัญหาในแนวทางนั้นคือหน้าต่างยังคงปรากฏขึ้นเมื่อคุณกด Alt-Tab ฉันชอบโทรHide()และด้วยวิธีนี้คุณไม่ต้องใช้ShowInTaskbarทรัพย์สินเลย
Andrew

@ แอนดรูฉันมีปัญหาเมื่อใช้Show()และHide(); หลังจากซ่อนแสดงและซ่อนแล้วจะไม่แสดงอีก
newbieguy

@newbieguy ฉันเดาว่าคุณต้องสร้างคำถามใหม่เนื่องจากปัญหาของคุณไม่เหมาะสำหรับการแสดงความคิดเห็นเกี่ยวกับคำตอบ คุณจะต้องให้ข้อมูลเพิ่มเติมเนื่องจากรหัสที่คุณใช้ คุณอาจใส่ลิงก์ไปยังคำตอบที่คุณพยายามใช้
Andrew

17

ฉันจะไปด้วย

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

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

17

อย่าลืมเพิ่มไฟล์ไอคอนลงใน alertIcon ของคุณมิฉะนั้นจะไม่ปรากฏในถาด


ส่วนที่จำเป็นที่สุดในหัวข้อนี้ คุณสามารถเพิ่มข้อมูลอีกเล็กน้อยวิธีบังคับให้ใช้ไอคอนเริ่มต้นได้อย่างไร
ที. โตดัว

12

ลองดู

 private void Form1_Load(object sender, EventArgs e)
    {
        notifyIcon1.BalloonTipText = "Application Minimized.";
        notifyIcon1.BalloonTipTitle = "test";
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            ShowInTaskbar = false;
            notifyIcon1.Visible = true;
            notifyIcon1.ShowBalloonTip(1000);
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ShowInTaskbar = true;
        notifyIcon1.Visible = false;
        WindowState = FormWindowState.Normal;
    }

1
หากคุณเพียงแค่ซ่อนจากแถบงานแทนที่จะเรียกthis.Hide()หน้าต่างจะยังคงปรากฏขึ้นเมื่อทำ Alt-Tab
Andrew

3

นี่เป็นวิธีที่ฉันใช้ในแอปพลิเคชันของฉันมันค่อนข้างง่ายและอธิบายได้ด้วยตนเอง แต่ฉันยินดีที่จะให้รายละเอียดเพิ่มเติมเพื่อตอบความคิดเห็นของคุณ

    public Form1()
    {
        InitializeComponent();

        // When window state changed, trigger state update.
        this.Resize += SetMinimizeState;

        // When tray icon clicked, trigger window state change.       
        systemTrayIcon.Click += ToggleMinimizeState;
    }      

    // Toggle state between Normal and Minimized.
    private void ToggleMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;
        this.WindowState = (isMinimized) ? FormWindowState.Normal : FormWindowState.Minimized;
    }

    // Show/Hide window and tray icon to match window state.
    private void SetMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;

        this.ShowInTaskbar = !isMinimized;           
        systemTrayIcon.Visible = isMinimized;
        if (isMinimized) systemTrayIcon.ShowBalloonTip(500, "Application", "Application minimized to tray.", ToolTipIcon.Info);
    }

2
วิธีนี้และวิธีแก้ปัญหาอื่น ๆ มีปัญหาเดียว: หากแบบฟอร์มซ่อนอยู่ภายใต้หน้าต่างอื่นผู้ใช้ส่วนใหญ่ไม่ต้องการย่อขนาดเมื่อคลิกที่ไอคอน แต่ควรเน้น ดูคำถามของฉันที่นี่: stackoverflow.com/questions/36797442/…
maf-soft

1

เมื่อคลิกที่ภาพในถาดระบบคุณสามารถตรวจสอบได้ว่ามองเห็นกรอบหรือไม่จากนั้นคุณต้องตั้งค่า Visible = true หรือ false


1

... และสำหรับเมนูการแจ้งเตือนคลิกขวาของคุณให้เพิ่มเมนูบริบทลงในแบบฟอร์มและแก้ไขและตั้งค่าเหตุการณ์ mouseclick สำหรับแต่ละเมนูบริบทโดยการดับเบิลคลิกที่รายการเหล่านั้นจากนั้นแนบเข้ากับไอคอนแจ้งเตือน 1 โดยเลือก ContextMenuStrip ในคุณสมบัติไอคอนแจ้งเตือน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.