在我们经常使用的软件中,当我们已经打开后,再次打开时,有的软件不会出现两个。例如有道词典,会将上次的界面显示出来,或者提示我们“该程序已经运行...”。我通过一个简单的C# WPF例子来说明。

首先我们要了解一下线程中的互斥体(Mutex),引用MSDN官方文档解释,这是一个同步基元,可以用于进程间同步。请参考下面的代码:

    public App()
{
bool isNewInstance;
string appName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
Mutex mtx = new Mutex(true, appName, out isNewInstance); if (!isNewInstance)
{
MessageBox.Show("The app is running now.");
Application.Current.Shutdown();
}
}

这样就可以实现一个单实例程序。当该程序已经运行一次之后,再运行时会提示我们“The app is running now.”.

另一种情况是再运行该程序时,直接把刚才的程序显示出来(可能此时程序已经最小化到任务栏)。 实现思路:先找到当前的Process,然后调用ShowWindow方法,把隐藏或者最小化的窗体进行显示。请参考下面的代码:

        [DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow); public App()
{
bool isNewInstance;
string appName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
Mutex mtx = new Mutex(true, appName, out isNewInstance); if (!isNewInstance)
{
Process[] myProcess = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(appName));
if (null != myProcess.FirstOrDefault())
{
ShowWindow(myProcess.FirstOrDefault().MainWindowHandle, );
}
//MessageBox.Show("The app is running now.");
Application.Current.Shutdown();
}
}

此时当我们再次运行程序时,会将第一次运行的实例调出来进行显示。比现实“该程序已经运行...”和谐多了。

博客中代码可以点击这里下载。

第一次写博客,如果写得不好还望前辈们多多指正。如果博客中有错误的地方欢迎在评论中指出。感谢您的阅读。:)

Update:

今天开始写一个新的项目时,也是需要做成单个实例。同样的代码,但是却可以同时运行多个。开发环境Win10 Pro 64bit,但是整个人就凌乱了。后来查阅资料:

http://stackoverflow.com/questions/19147/what-is-the-correct-way-to-create-a-single-instance-application

在项目根目录下新建一个Program类,并且将启动项目设置为Program类,代码如下:

    class Program
{
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hwnd, int nCmdShow); [STAThread]
static void Main()
{
bool isNewInstance;
string appName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
Mutex mtx = new Mutex(true, appName, out isNewInstance); if (!isNewInstance)
{
Process[] myProcess = Process.GetProcessesByName(System.IO.Path.GetFileNameWithoutExtension(appName));
if (null != myProcess.FirstOrDefault())
{
ShowWindow(myProcess.FirstOrDefault().MainWindowHandle, );
}
//MessageBox.Show("The app is running now.");
//Application.Current.Shutdown(); }
else
{
App app = new App();
app.Run(new MainWindow());
}
}
}

记得删除掉原来App中的后台代码。这样就可以完美的完成一个单实例应用程序。

感激您的阅读,代码点击这里下载。

C# 实现单实例程序的更多相关文章

  1. WPF使用Mutex创建单实例程序失效

    vs2019 1.引入名称空间 using System.Threading; using System.Runtime.InteropServices; 2.导入dll并声明方法 [DllImpor ...

  2. Qt实现应用程序单实例运行--LocalServer方式

    使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...

  3. WPF:如何实现单实例的应用程序(Single Instance)

    原文:WPF:如何实现单实例的应用程序(Single Instance) 好吧,这是我将WPF与Windows Forms进行比较的系列文章的第四篇,讨论一下如何实现单实例(single instan ...

  4. 使用 WPF 创建单实例应用程序

    一个简单的例子就是大家在使用很多应用程序,例如在使用Microsoft Word 时会遇到一种情况,不管你打开多少个文档,系统一次只能加载一个winword.exe 实例.当打开新文档时,文档在新窗口 ...

  5. C++实现程序单实例运行的两种方式

    简介 在我们编写程序的时候,经常会注意到的一个问题就是如何能够让程序只运行一个实例,确保不会让同一个程序多次运行,从而产生诸多相同进程,给我们的带来不便呢?那么常用的有以下四种方法,第一种方法是通过扫 ...

  6. c#设计应用程序单实例运行

    利用WindowsFormsApplicationBase的IsSingleInstance来控制应用程序只能单实例运行. [DllImport("user32.dll", Ent ...

  7. WPF点滴(2) 创建单实例应用程序

    最近有同事问道在应用程序启动之后,再次双击应用程序,如何保证不再启动新的应用程序,而是弹出之前已经启动的进程,本质上这就是创建一个单实例的WPF应用程序.在VS的工程树中有一个App.xaml和App ...

  8. WPF 单实例应用程序

    例如:Microsoft Word,不管打开多少个文档(也不管它们是如何打开的),一次只能加载 winword.exe 一个实例. 这便是单实例应用程序. 对于这种单实例应用程序,WPF 本身并未提供 ...

  9. DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法

    原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

随机推荐

  1. uniq命令注意事项,检查重复行的时候,只会检查相邻的行。

    今天在使用uniq命令统计数量时,uniq -c总是得不到想要的效果,相同的行没有合并,例如 后来在http://ju.outofmemory.cn/entry/78365才看到,原来uniq检查重复 ...

  2. 《oracle每日一练》Oracle DBLink连接数过多的问题(Ora-02020)

    本文转自Oracle DBLink连接数过多的问题(Ora-02020) 今天在处理资料同步问题,需要将其它几个DB Server的资料同步到一个目地资料库,采用的方式是:DBLink+Job ,然而 ...

  3. IPC----消息队列

    消息队列可以认为是一个消息链表,System V 消息队列使用消息队列标识符标识.具有足够特权的任何进程都可以往一个队列放置一个消息,具有足够特权的任何进程都可以从一个给定队列读出一个消息.在某个进程 ...

  4. 用pywinauto进行win32应用程序的测试

    之前做win32应用测试时,用过很多大家耳熟成详的工具,接触pywinauto之前,对它的了解也不多,然而,随着对它了解的增多,发现它借助了python动态对象的能力,使得代码即便于书定,也便于阅读, ...

  5. [猜数字]把两个数和告诉A,积告诉B,求这两个数是什么

    1-20的两个数把和告诉A,积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了,问这两个数是多少? 分析: 设和为S,积为M. 首先,A:我不知道. 说明:S可以分解成多个 ...

  6. Unity3D研究院之手游开发中所有特殊的文件夹(转)

    这里列举出手游开发中用到了所有特殊文件夹. 1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor  和 /Edi ...

  7. SolrCloud环境配置

    Solr是一个企业级搜索服务器,对外提供Web-Service接口,用户可以通过http请求,向搜索引擎提交xml或者json格式的数据,生成索引:然后可以通过http get请求查找,获取返回的xm ...

  8. iOS SHA1加密实现方法

    使用方法 先导入头文件 #import "SHA1.h" //SHA1测试 NSString* sh1=[SHA1 getSha1String:"]; NSLog(@&q ...

  9. 用 get 同步/异步 方式获取网络数据并输出

    //同步请求 //创建NSString用来存储请求的网址 NSString* str=@"http://v.juhe.cn/weather/index?format=2&cityna ...

  10. 屏幕截图、录像FastStone Capture

    作为一款极其优秀好用的屏幕截图软件,FastStone Capture 具有体积小巧.功能强大.操作简便等优点,其方便的浮动工具条和便捷的快捷键堪称完美结合,截图后的图片编辑与保存选项也特别丰富和方便 ...