ฉันจะสร้างแอปพลิเคชัน. NET Windows Forms ที่ทำงานเฉพาะใน System Tray ได้อย่างไร


216

ฉันต้องทำอะไรเพื่อให้แอปพลิเคชันWindows Formsทำงานใน System Tray

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



9
คำตอบส่วนใหญ่มีบางอย่างขาดหายไป - อย่าลืมตั้งค่าicon.Visible = falseจากนั้นDispose()ไอคอนเมื่อออกจากแอปพลิเคชันของคุณ มิฉะนั้นคุณจะยังเห็นไอคอนหลังจากที่โปรแกรมของคุณออก หลังจากทดสอบสองสามครั้งคุณจะไม่รู้อีกต่อไปว่าไอคอนใดเป็นของจริง
Tomasz Gandor

หากคุณอยู่หลังแนวทาง WPF ที่ทันสมัยกว่า - คุณสามารถลองได้ที่: codeproject.com/Articles/36788/…
Murray Foxcroft

คำตอบ:


86

บทความรหัสโครงการการสร้างแอปพลิเคชัน Tasktrayให้คำอธิบายที่ง่ายมากและตัวอย่างของการสร้างแอปพลิเคชันที่มีอยู่ในถาดระบบเท่านั้น

โดยทั่วไปเปลี่ยนApplication.Run(new Form1());บรรทัดในProgram.csเพื่อเริ่มต้นคลาสที่สืบทอดจากApplicationContextและมีตัวสร้างสำหรับคลาสนั้นเริ่มต้น aNotifyIcon

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();
    }
}

13
นี่คือจุดเริ่มต้นที่ดี โปรดทราบว่า "AppIcon" จะต้องเป็นชื่อของทรัพยากรที่คุณเพิ่มด้วย "โครงการ -> คุณสมบัติ -> ทรัพยากร -> เพิ่มทรัพยากร" แล้วคอมไพล์โครงการใหม่
Lavamantis

1
ฉันทำคุณสมบัติ .. ทรัพยากร .. เพิ่ม .. .. recompiled ยังคงได้รับ "ข้อผิดพลาด CS0103 ชื่อ 'ทรัพยากร' ไม่มีอยู่ในบริบทปัจจุบัน"
barlop

@barlop ฉันต้องเขียนแบบนี้: Properites.Resources.AppIcon
Simon Perepelitsa

@SimonPerepelitsa ขอบคุณฉันไม่แน่ใจว่าสิ่งที่ฉันทำในการทดลองของฉันฉันหมายถึงการแสดงความคิดเห็นสิ่งที่ทำงานได้ แต่ฉันต้องลืมสิ่งที่ฉันทำที่ทำงาน แต่ท้ายที่สุดวิธีที่ฉันใช้คือการลากไอคอนแจ้งเตือนจากจานสีของสิ่งที่คุณสามารถลาก จากนั้นคลิกที่แบบฟอร์มคลิกลูกศรเล็ก ๆ ที่ปรากฏขึ้นเพื่อเลือกไอคอนสำหรับมัน!
barlop

17

ดังที่ 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;
        }
    }

15

ฉันเขียนแอป Traybar ด้วย. NET 1.1 และฉันไม่ต้องการแบบฟอร์ม
ก่อนอื่นให้ตั้งค่าวัตถุเริ่มต้นของโครงการเป็น Sub Mainซึ่งกำหนดไว้ในโมดูล
จากนั้นโปรแกรมสร้างส่วนประกอบที่: และNotifyIcon อย่าลืมใส่"ออก" หรือสิ่งที่คล้ายกัน ผูกกับ วิงวอน ในการจัดการเหตุการณ์สำหรับเลิกจะแน่ใจว่าจะเรียกตั้งแล้ว เพิ่มสิ่งที่คุณต้องการและจัดการอย่างถูกต้อง :)ContextMenu
MenuItem
ContextMenuNotifyIcon
Application.Run()
MenuItemNotifyIcon.Visible = FalseApplication.Exit()ContextMenu


11
  1. สร้างแอปพลิเคชัน Windows ใหม่ด้วยตัวช่วยสร้าง
  2. ลบForm1จากรหัส
  3. นำรหัสใน Program.cs Form1เริ่มต้นขึ้น
  4. ใช้NotifyIconคลาสเพื่อสร้างไอคอนถาดระบบของคุณ (กำหนดไอคอนให้กับมัน)
  5. เพิ่มเมนูบริบทให้กับมัน
  6. หรือตอบสนองต่อNotifyIconmouseclick ของและความแตกต่างระหว่างคลิกขวาและซ้ายตั้งค่าเมนูของคุณและแสดงมันที่เคยกดปุ่ม (ขวา / ซ้าย)
  7. Application.Run()เพื่อให้แอปทำงานApplication.Exit()ต่อไปเพื่อเลิก bool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}หรือ จากนั้นตั้งค่าbRunning = false;ให้ออกจากแอพ

โปรแกรมจะหยุดการทำงานเมื่อถึงจุดสิ้นสุดของ Main และไม่มี UI thread คุณดูแลเรื่องนี้เป็นวิธีการแก้ปัญหาของคุณ? หากคุณได้รับการแก้ไขปัญหาเหล่านั้นแล้วคุณจะได้รับการลงคะแนนเสียงของฉัน :)
แมทธิวยอดแหลม

คุณได้รับคะแนนของฉัน อาจแค่พูดถึงว่าคุณยังต้องโทรหา Application.Run โดยไม่มีพารามิเตอร์ใด ๆ

อัปเดตด้วยทางเลือก App.Run
Wolf5

thread.sleep มากเกินไปฉันรู้ แต่ถ้าคุณมีทางเลือก "sleep" ที่ดีกว่าในการใช้ Application.Run ลองโพสต์ :)
Wolf5

Thread.Sleep เป็นความคิดที่ไม่ดี: คุณจะจบลงด้วยการใช้ CPU และแบตเตอรี่มากกว่าที่คุณเพิ่งใช้ Application.Run เหมือนที่คุณต้องการ
Sneftel

8

แอปพลิเคชั่น "System Tray" เป็นเพียงแอปพลิเคชั่นที่ชนะแบบปกติความแตกต่างเพียงอย่างเดียวคือมันสร้างไอคอนในพื้นที่ถาดระบบ windows ในการสร้างไอคอน sys.tray ใช้ส่วนประกอบ NotifyIcon คุณสามารถค้นหาได้ในกล่องเครื่องมือ (ตัวควบคุมทั่วไป) และแก้ไขคุณสมบัติของมัน: ไอคอนเคล็ดลับเครื่องมือ นอกจากนี้ยังช่วยให้คุณสามารถจัดการกับการคลิกเมาส์และดับเบิลคลิกข้อความ

และอีกสิ่งหนึ่งเพื่อให้ได้รูปลักษณ์และความรู้สึกหรือแอพถาดมาตรฐาน เพิ่มบรรทัด followinf ในเหตุการณ์แสดงแบบฟอร์มหลักของคุณ:

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

6

เท่าที่ฉันทราบคุณยังต้องเขียนแอปพลิเคชันโดยใช้แบบฟอร์ม แต่ไม่มีตัวควบคุมในแบบฟอร์มและไม่เคยตั้งค่าให้ปรากฏ ใช้ NotifyIcon (ตัวอย่าง MSDN ซึ่งสามารถหาได้ที่นี่ ) เพื่อเขียนใบสมัครของคุณ


1
ไม่มาก แบบฟอร์มของคุณสามารถมีการควบคุมได้ แต่ควรจะซ่อนไว้โดยค่าเริ่มต้น
Rune Grimstad

5
คุณไม่ต้องการรูปแบบใด ๆ หลังจากตัวช่วยสร้างการสร้าง Window App ใหม่เพียงแค่ลบ Form1 และลบรหัสที่เปิดออก คุณสามารถเขียนได้ทั้งหมดจาก Program.cs ด้วย NotifyIcon และ ContextMenu ไม่ต้องการอะไรอีกแล้ว
Wolf5

1
ฉันรู้ว่ามันสามารถควบคุมได้ แต่ OP ไม่ต้องการมัน
Matthew Steeples

2

นี่คือวิธีที่ฉันทำกับVisual Studio 2010 , .NET 4

  1. สร้างแอปพลิเคชัน Windows Forms ตั้ง 'สร้างแอปพลิเคชันอินสแตนซ์เดียว' ในคุณสมบัติ
  2. เพิ่ม ContextMenuStrip
  3. เพิ่มรายการบางรายการลงในแถบเมนูบริบทดับเบิลคลิกที่รายการเพื่อรับตัวจัดการเช่น 'exit' (ดับเบิลคลิก) -> handler -> me.Close ()
  4. เพิ่ม NotifyIcon ในชุดการออกแบบ contextMenuStrip ให้กับสิ่งที่คุณเพิ่งสร้างเลือกไอคอน (คุณสามารถหาบางอย่างในโฟลเดอร์ VisualStudio ภายใต้ 'common7 ... ')
  5. ตั้งค่าคุณสมบัติสำหรับฟอร์มในตัวออกแบบ: FormBorderStyle: none, ShowIcon: false, ShowInTaskbar: false, Opacity: 0%, WindowState: Minimized
  6. เพิ่ม Me.Visible = false ที่ส่วนท้ายของ Form1_Load สิ่งนี้จะซ่อนไอคอนเมื่อใช้Ctrl+Tab
  7. เรียกใช้และปรับตามต้องการ

2

มันเป็นกรอบที่เป็นมิตรมากสำหรับแอปพลิเคชันพื้นที่แจ้งเตือน ... มันเพียงพอที่จะเพิ่ม NotificationIcon ให้กับฟอร์มพื้นฐานและเปลี่ยนรหัสที่สร้างขึ้นอัตโนมัติเป็นรหัสด้านล่าง:

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;
        }
    }
}

-2

เพียงเพิ่ม

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

ไปยังวัตถุรูปแบบของคุณ คุณจะเห็นไอคอนที่ถาดระบบเท่านั้น


ที่วางฟอร์มเหนือแถบงาน ไม่เหมือนกัน คุณพยายามตอบกระทู้อื่นหรือไม่?
LarsTech

1
ไม่มีไอคอนบนทาสก์บาร์เราไม่เห็นแบบฟอร์ม โปรแกรมมองเห็นมีอยู่ที่ถาดระบบเท่านั้น อะไรข้างต้น หมายถึง?
YTerle

คำตอบของคุณไม่มีบริบทใด ๆ คุณใช้คลาส NotifyIcon อยู่หรือไม่? ถ้าไม่เช่นนั้นแบบฟอร์มของคุณจะย่อเล็กสุดไปที่มุมซ้ายล่างเหนือแถบงาน
LarsTech

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