zoukankan      html  css  js  c++  java
  • WPF程序最小化到任务通知栏

    我们通常使用的桌面软件,都可以最小化到任务通知栏,并且可以从任务通知栏再打开当前软件,或者通过软件的快捷方式从任务通知栏呼出。

    我们可以通过下面的方式把WPF程序最小化到任务栏。由于WPF并没有实现Notification的功能,我们需要借助于WinForm中NotifyIcon来实现,请看代码:

    using WinForms = System.Windows.Forms;
    
    private WinForms.NotifyIcon _notifyIcon;
    private WinForms.ContextMenu _contextMenu;
    private WinForms.MenuItem _openWindow;
    private WinForms.MenuItem _closeApp;
    private System.ComponentModel.IContainer _iContainer;
    
    public MainWindow()
    {
    _contextMenu = new WinForms.ContextMenu();
    _openWindow = new WinForms.MenuItem() { Text = "Hiden" };
    _closeApp = new WinForms.MenuItem() { Text = "Exit"};
    _iContainer = new System.ComponentModel.Container();
    
    WinForms.MenuItem[] menuItems = new WinForms.MenuItem[] { _openWindow, _closeApp };
    
    _contextMenu.MenuItems.AddRange(menuItems);
    
    _openWindow.Click += _openWindow_Click;
    _closeApp.Click += _closeApp_Click;
    
    _notifyIcon = new WinForms.NotifyIcon(_iContainer);
    _notifyIcon.Icon = new System.Drawing.Icon("Todolist.ico");
    _notifyIcon.Text = "Todolist";
    _notifyIcon.Visible = true;
    _notifyIcon.MouseDoubleClick += _notifyIcon_MouseDoubleClick;
    _notifyIcon.ContextMenu = _contextMenu;
    
    }
    

    当关闭WPF窗体时,将当前窗体隐藏即可。

     private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
     {
        this.Hide();
        e.Cancel = true;
     }
    

    这样我们就可以实现关闭窗体时,将程序最小化到任务通知栏了。

    接下来我们要通过点击程序的快捷方式,再次呼出当前已经启动的程序。首先在项目的根目录新建一个类,我们命名为Program,接下来,我们右击项目--->属性-->将启动对象设置为当前文件,如图所示:

    下面我们来看一下Program类:

    class Program
        {
            [DllImport("user32.dll", EntryPoint = "FindWindow")]
            private static extern IntPtr FindWindow(string lp1, string lp2);
    
            [DllImport("user32.dll")]
            private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);
    
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool SetForegroundWindow(IntPtr hWnd);
    
            [DllImport("user32.dll")]
            static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
    
            [STAThread]
            static void Main()
            {
                string appName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
                bool isNewInstance;
    
                using(Mutex mutex = new Mutex(true,appName,out isNewInstance))
                {
                    if (!isNewInstance)
                    {
                        IntPtr handle = FindWindow(null, "MainWindow");
                        if (handle != IntPtr.Zero)
                        {
                            const int SW_SHOW = 5;
                            const int SW_RESTORE = 9;
                            const uint WM_SHOWWINDOW = 0x0018;
                            const int SW_PARENTOPENING = 3;
    
                            ShowWindow(handle, SW_RESTORE);
                            ShowWindow(handle, SW_SHOW);
                            // send WM_SHOWWINDOW message to toggle the visibility flag
                            SendMessage(handle, WM_SHOWWINDOW, IntPtr.Zero, new IntPtr(SW_PARENTOPENING));
                            SetForegroundWindow(handle);
                        }
                        return;
                    }
    
                    App app = new App();
                    app.MainWindow = new MainWindow();
                    app.MainWindow.Show();
                    app.Run();
                }
            }
        }

    这里我们借助了一些Win32的API来实现。

    通过上面的代码,我们就可以实现一个将WPF程序最小化到任务通知栏,并且可以点击程序/软件快捷方式从任务通知栏显示程序的功能。

    代码下载

    另外实现程序最小化到任务通知栏,可以使用:Hardcodet.Wpf.TaskbarNotification,具体实现可以参考:http://www.hardcodet.net/

    感谢您的阅读!

  • 相关阅读:
    linux命令整理
    各种提权姿势总结
    常用端口信息说明和利用
    近年来爆发的CVE漏洞编号
    一个优秀的SSH远程终端工具
    python-读写文件的方式
    kali安装ssh服务
    一套实用的渗透测试岗位面试题
    使用 python快速搭建http服务
    asciinema使用
  • 原文地址:https://www.cnblogs.com/yang-fei/p/4412285.html
Copyright © 2011-2022 走看看