C# 实现单实例程序
在我们经常使用的软件中,当我们已经打开后,再次打开时,有的软件不会出现两个。例如有道词典,会将上次的界面显示出来,或者提示我们“该程序已经运行...”。我通过一个简单的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, 1); } //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, 1); } //MessageBox.Show("The app is running now."); //Application.Current.Shutdown(); } else { App app = new App(); app.Run(new MainWindow()); } } }
记得删除掉原来App中的后台代码。这样就可以完美的完成一个单实例应用程序。
感激您的阅读,代码点击这里下载。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
C#屏幕截图
原文: C#屏幕截图 今天通过C#来实现一个简单的屏幕截图功能。实现思路,获取鼠标按下去的位置和鼠标左键释放的位置,计算这个区域的宽度和高度。然后通过 Graphics.CopyFromScreen 方法便可以获取到屏幕截图了。 下面通过C#+WPF来实现这个功能,代码如下: XAML: <Window x:Class="WPFCaptureScreenShot.CaptureWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="CaptureWindow" AllowsTransparency="True" WindowStyle="None" Background="Black" Opacity="0.1" WindowState="Maximized" MouseDown="CaptureWindow_MouseDown" MouseMove="Capture...
- 下一篇
C# Settings使用小结
原文: C# Settings使用小结 本篇博客将介绍C#中Settings的使用。 首先介绍一个桌面程序中的例子,当我们新安装一个软件,软件启动后会有例如新手指导等窗体弹出来,每次都需要自己去关闭它。当然这些软件都会提供例如不再显示等功能。当选择不再显示功能后,这些窗体以后再也不显示了。 对于这些设置,可以采用下面的一些方法来存储,自定义XML文件,注册表,当然还可以是C#中自带的Settings文件。推荐使用Settings文件。注册表轻易不要使用,自定义XML在使用时需要解析,可以当备选方案。 下面通过一个例子来展示, 新建一个WPF项目, 蓝色背景的便是Settings, 一个Setting有4个属性Name,Type,Scope,Value。重点讲一下Scope属性,Scope属性有两个值Application,User。这两者区别,Scope值为Application时,对应的Setting在运行时不可以修改。Scope值为User时,对应的Setting在运行时可以修改。 Setting保存位置:当程序编译后,Setting的值保存在<AssemblyName>...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装