代码之家  ›  专栏  ›  技术社区  ›  DotNetRussell

从系统托盘图标打开窗口

  •  5
  • DotNetRussell  · 技术社区  · 12 年前

    所以我创建了一个带有系统托盘图标的窗口。窗口开始最小化,并将在单击系统托盘图标时重新出现。但是,只有当您单击最小化按钮时,它才能工作。如果您单击红色退出按钮,窗口将消失,系统托盘图标仍保留(应该是这样),但当您单击它时,程序会抛出一个错误。

    无法设置可见性或调用Show、ShowDialog或 WindowInteropHelper.EnsureHandle(窗口关闭后的句柄)。

    这是相关代码

    public partial class MainWindow : Window
    {
        public static NotifyIcon icon;
    
        List<string> food = new List<string>();
        bool on = false;
    
        public MainWindow()
        {
            InitializeComponent();
    
            food.Add("Breakfast");
            food.Add("Soups");
            food.Add("Vegetables");
            food.Add("Crab roll");
            food.Add("Sushi");
            food.Add("Egg rolls");
            food.Add("Salad");
    
    
            MainWindow.icon = new NotifyIcon();
    
            window1.WindowState = WindowState.Minimized; 
    
            icon.Icon = new System.Drawing.Icon("favicon.ico");
            icon.Visible = true;
    
            icon.Click += new EventHandler(icon_Click);
            icon.BalloonTipClicked += new EventHandler(icon_BalloonTipClicked);
            icon.DoubleClick += new EventHandler(icon_DoubleClick);
            icon.BalloonTipClosed += new EventHandler(icon_BalloonTipClosed);
            icon.MouseMove += new System.Windows.Forms.MouseEventHandler(icon_MouseMove);
            StateChanged += new EventHandler(MainWindow_StateChanged);
    
        }
    
        void icon_BalloonTipClicked(object sender, EventArgs e)
        {
            this.Show(); //This is where the error is 
            window1.WindowState = WindowState.Normal;
        }
    
        void icon_DoubleClick(object sender, EventArgs e)
        {
            this.Show(); //This is where the error is 
            window1.WindowState = WindowState.Normal;
        }
    
        void icon_BalloonTipClosed(object sender, EventArgs e)
        {
            on = false;
        }
    
        void icon_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
    
            if (!on)
            {
                icon.BalloonTipText = "";
                foreach(string item in food){
                    if (!item.Contains("Breakfast") && !item.Contains("Soups") && !item.Contains("Vegetables"))
                    {
                        icon.BalloonTipText += item+"\n";
                    }
                }
                icon.ShowBalloonTip(10);
                on = true;
            }
    
        }
    
        void MainWindow_StateChanged(object sender, EventArgs e)
        {
            if (window1.WindowState == WindowState.Minimized)
            {
                this.Hide();
            }
        }
    
        private void icon_Click(Object sender, EventArgs e)
        {
            icon.BalloonTipText = "";
            foreach (string item in food)
            {
                if (!item.Contains("Breakfast") && !item.Contains("Soups") && !item.Contains("Vegetables"))
                {
                    icon.BalloonTipText += item + "\n";
                }
            }
            icon.ShowBalloonTip(10);
            on = true;
    
        }        
    }
    
    1 回复  |  直到 11 年前
        1
  •  5
  •   Blachshma naturom    12 年前

    拦截 Closing 窗口的事件,以及 取消 它(这将阻止窗口关闭)-然后 隐藏 窗口:

        public MainWindow()
        {
            // Subscribe to closing event (when X is pressed)
            this.Closing += MainWindow_Closing;
            InitializeComponent();
        }
    
        void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            // Prevent window from closing
            e.Cancel = true;
    
            // Hide window
            this.Hide();
        }