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

我们可以通过下面的方式把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 = ;
const int SW_RESTORE = ;
const uint WM_SHOWWINDOW = 0x0018;
const int SW_PARENTOPENING = ; 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/

感谢您的阅读!

WPF程序最小化到任务通知栏的更多相关文章

  1. windows vbs启动多个应用程序并使程序最小化(显示桌面)

      windows vbs启动多个应用程序并使程序最小化(显示桌面) CreationTime--2018年7月26日11点18分 Author:Marydon 1.应用场景 每天开机后,都需要打开平 ...

  2. C# 设置程序最小化到任务栏右下角,鼠标左键单击还原,右键提示关闭程序

    首先设置程序最小化到任务栏右下角 先给窗口添加一个notifyIcon控件 为notifyIcon控件设置ICO图标(不设置图标将无法在任务栏显示) 给notifyIcon控件添加点击事件 然后是最小 ...

  3. WPF应用最小化至系统托盘运行

    原文:WPF应用最小化至系统托盘运行 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/details/5178889 ...

  4. delphi中最小化其他程序及所有程序最小化(使用 shell.minimizeAll 和自己寻找窗口这两种办法)

    1.所有程序最小化 uses ComObj;   var    shell : OleVariant; begin      shell := CreateOleObject('Shell.Appli ...

  5. Directx11教程(21) 修正程序最小化异常bug

    原文:Directx11教程(21) 修正程序最小化异常bug       很长时间竟然没有注意到,窗口最小化时候,程序会异常,今天调试水面程序时,随意间最小化了窗口,发现程序异常了.经过调试,原来程 ...

  6. delphi如何让程序最小化到任务栏(转)

    现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标.象FoxMail 3.0 NetVampire 3.0等都提供了这样的功 ...

  7. WPF 最大化最小化窗口

    public static void FullOrMin(this Window window)        {            //如果是全屏,则最小化            if (win ...

  8. Delphi如何让程序最小化到任务栏(截取WM_SYSCOMMAND后,调用Shell_NotifyIcon)

    现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标.象FoxMail 3.0 NetVampire 3.0等都提供了这样的功 ...

  9. delphi如何让程序最小化到任务栏(使用Shell_NotifyIcon API函数)

    现在很多的应用程序都有这样一种功能,当用户选择最小化窗口时,窗口不是象平常那样最小化到任务栏上,而是“最小化”成一个任务栏图标.象FoxMail 3.0 NetVampire 3.0等都提供了这样的功 ...

随机推荐

  1. phpcms的评论改为留言板研究

    研究背景: phpcms里面默认是没有留言板的,之前我的博客里发过一个二次开发简介,里面有一个简单的留言板,包含前台提供表单,后台留言审核等功能,但是不提供用户登录等操作. 研究思路: phpcms里 ...

  2. ubuntu update dns server

    edit:  /etc/resolvconf/resolv.conf.d/base nameserver 114.114.114.114 execute this: $ resolvconf -u f ...

  3. maven package

    maven package test包下执行test 的配置文件 生成target目录,编译.测试代码,生成测试报告,生成jar/war文件 maven 配置文件详解 http://blog.csdn ...

  4. poj 1611(并查集)

    http://poj.org/problem?id=1611 题意:有个学生感染病毒了,只要是和这个学生接触过的人都会感染,而和这些被感染者接触的人,也会被感染,现在给定你一些协会的人数,以及所在学生 ...

  5. struts2框架 初始别

    struts2 是webwork和struts合并而来. 1.下载struts2 说明: Full Distribution: 为完整版下载,建议下载它 Example Applications:st ...

  6. NSIS脚本入门和进阶方法

    NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序.它提供了安装.卸载.系统设置.文件解压缩等功能.对于新手来说,它有 ...

  7. Qt ini配置文件读写

    #include <QSettings> void MainWindow::saveIni() { //如果ini文件不存在,创建新ini文件,存在赋值 QSettings *setIni ...

  8. ffmpeg-20160806-bin.7z

    ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...

  9. Session原理浅析

    什么是Sesson? 简单说就是一个会话级的cookie,外加服务器端内存中一组散列表. 当你关闭浏览器的时候,这个cookie将消失. 这个cookie不写在磁盘上,而是存在于浏览器缓存. 关于Se ...

  10. linux下修改tomcat内存大小

    转载自:http://blog.sina.com.cn/s/blog_7fb5109d0101o49a.html 1.  出现此问题的原因:       在tomcat中发布了多个webapp引用,每 ...