WPF 单实例应用程序
例如:Microsoft Word,不管打开多少个文档(也不管它们是如何打开的),一次只能加载 winword.exe 一个实例。 这便是单实例应用程序。
对于这种单实例应用程序,WPF 本身并未提供解决方法,但是可以使用几种变通的方法。基本的技术是当触发 Application.StartUp 事件时,检查另一个应用程序是否正在运行。最简单的方法是使用一个全局的 mutex 对象(mutex对象是操作系统提供的一个用于进程之间通信的同步对象)。这种方法很简单但是功能有限——最重要的是,应用程序新实例无法和已经存在的实例进行通信。 因为当你打开文件的时候,比如*.doc 你需要将该文件的一些基本信息传递到已打开的实例中才行。 当然,你还可以使用 remoting、WCF 进行通信。那还得开发服务端,也使其变得复杂。
但是最简单的实现方法,并且也是WPF团队当前推荐的方法是,使用Windows窗体提供的内置支持,这一内置支持最初是用于 Visual Basic 应用程序的。这种方法在后台处理杂乱的问题。
那么,如何使用为 Windows 窗体和 Visual Basic 设计的这一特性,来管理使用 C# 开发的 WPF 应用程序呢?本质上,老式的应用程序类充当了 WPF 应用程序类的一个包装器。当启动应用程序时,创建老式的应用程序类,然后老式的应用程序类创建WPF程序应用类。老式的应用程序类处理实例管理问题,而 WPF 应用程序类处理真正的应用程序。 下图显示了这几部分的交互方式。

了解以上内容后,下载源码研究就简单啦,在传个实战运行效果上来:

源码下载:http://files.cnblogs.com/andrew-blog/1023_SingleInstanceApplication.rar
源码说明:*.testDoc 请以右键 -- 打开方式 选择 1023_SingleInstanceApplication.exe 程序进行打开即可。 (你也可以在windows中注册*.testDoc文件,双击打开即可,注册方法可以采用源码中注释掉的部分 FileRegistrationHelper 类使用Microsoft.Win32 命名空间中的类进行注册,但这需要管理员权限)
参考:http://www.wxzzz.com/?id=134
WPF 单实例应用程序的更多相关文章
- 使用 WPF 创建单实例应用程序
一个简单的例子就是大家在使用很多应用程序,例如在使用Microsoft Word 时会遇到一种情况,不管你打开多少个文档,系统一次只能加载一个winword.exe 实例.当打开新文档时,文档在新窗口 ...
- WPF点滴(2) 创建单实例应用程序
最近有同事问道在应用程序启动之后,再次双击应用程序,如何保证不再启动新的应用程序,而是弹出之前已经启动的进程,本质上这就是创建一个单实例的WPF应用程序.在VS的工程树中有一个App.xaml和App ...
- wpf单实例运行
默认情况下我们可以打开一个应用程序多个实例,例如你双击一个exe多次.当然有些时候这么做会带来很多好处,但是有时我们又不希望这么做,要避免这个问题其实很简单,同WinForm中单实例运行一个应用是一样 ...
- WPF学习笔记 - 如何用WPF创建单实例应用程序
使用一个已命名的(操作系统范围的)互斥量. bool mutexIsNew; using(System.Threading.Mutex m = new System.Threading.Mulex(t ...
- C# 实现单实例程序
在我们经常使用的软件中,当我们已经打开后,再次打开时,有的软件不会出现两个.例如有道词典,会将上次的界面显示出来,或者提示我们“该程序已经运行...”.我通过一个简单的C# WPF例子来说明. 首先我 ...
- DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法
原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...
- 单实例运行tz
(引用了 Microsoft.VisualBasic.ApplicationServices)SingleInstanceApplicationWrapper.cs using System.W ...
- 单实例 winform zz
(引用了 Microsoft.VisualBasic.ApplicationServices)SingleInstanceApplicationWrapper.cs using System.Wind ...
- WPF:构建应用程序
原文 http://www.cnblogs.com/free722/archive/2011/11/13/2247455.html WPF相关的项目内容包含在App.Xaml和Window1.xaml ...
随机推荐
- javascript获取地址栏参数
http://gzycm520.blog.51cto.com/175220/71030方法一: <script type="text/javascript"> < ...
- C#:列表视图操作类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...
- Windows快捷键命令
1. 新建一个文件夹: Ctrl + shift + N; 2. Windows 查看端口信息: 1.进入cmd窗口; 2.netstat -ano : 列出所有端口的情况.在列表中我们观察被占用的端 ...
- 实战DeviceIoControl系列之四:获取硬盘的详细信息
Q 用IOCTL_DISK_GET_DRIVE_GEOMETRY IOCTL_STORAGE_GET_MEDIA_TYPES_EX只能得到很少的磁盘参数,我想获得包括硬盘序列号在内的更加详细的信息,有 ...
- appium 1.6.3 + ios 10.2 + xcode 8.2.1 真机运行iphone app
appium命令行启动: appium --address "127.0.0.1" --session-override --pre-launch --debug-log-spac ...
- Atitit.软件GUI按钮与仪表盘(01)--报警系统--
Atitit.软件GUI按钮与仪表盘(01)--报警系统-- 1. 温度报警区(鲁大师,360taskman) 1 2. os-区-----cpu_mem_io资源占用监测 1 3. Vm区 1 4. ...
- Windows 7 Path环境变量255限制的解决办法,SUBST
C:\Users\xxx>subst /? Associates a path with a drive letter. SUBST [drive1: [drive2:]path] SUBST ...
- JVM基础学习之基本概念、可见性与同步
开发高性能并发应用不是一件容易的事情.这类应用的例子包括高性能Web服务器.游戏服务器和搜索引擎爬虫等.这样的应用可能需要同时处理成千上万个请求.对于这样的应用,一般采用多线程或事件驱动的 架构 .对 ...
- maven 中使用jstl 错误解决
maven 中使用jstl表达式中出现如上错误.原因: 导入jstl 的jar包,却没有在pom文件中添加jstl相关的jar依赖项. <!--jstl表达式--> <depende ...
- 解决:ubuntu 里文件夹带锁
sudo chown -R <user-name> <folder-name> /* 其中-R的意思是recursive,你懂的,chown --help可以查看帮助信息 */ ...