我们通常使用的桌面软件,都可以最小化到任务通知栏,并且可以从任务通知栏再打开当前软件,或者通过软件的快捷方式从任务通知栏呼出。
我们可以通过下面的方式把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/
感谢您的阅读!
原文:http://www.cnblogs.com/yang-fei/p/4412285.html