DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法
原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
网上关于C#单例运行程序的方法都是比较简单,有些甚至是无法实现功能的,不知道他们试没试过就发帖,因为自己之前都是用第三方控件DevExpress,单例运行也是用它本身自带的一个方法,调用此方法需要引用DevExpress的DevExpress.DevAV.v17.1.Data.dll
-
static void Main()
-
{
-
var appName= Process.GetCurrentProcess().ProcessName;
-
using (DevExpress.Internal.DevAVDataDirectoryHelper.SingleInstanceApplicationGuard(appName, out exit))
-
{
-
if (exit)
-
return;
-
Application.EnableVisualStyles();
-
Application.SetCompatibleTextRenderingDefault(false);
-
Application.Run(new Form1());
-
}
-
}
以前懒,看到有现成的就拿现成的,也没去想具体如何实现,刚好有人问起,才决定去看看源码,发现DevExpress的这个方法原来是用了Mutex来实现的,整合了一下资料,重新写一个供C#桌面应用程序通用的单例运行方法,代码如下:
其中需要引用以下命名空间:
-
using System;
-
using System.Diagnostics;
-
using System.Drawing;
-
using System.Runtime.InteropServices;
-
using System.Security;
-
using System.Threading;
-
/// <summary>
-
/// 单实例应用程序--by涛神
-
/// </summary>
-
public class SingleInstanceApplication
-
{
-
/// <summary>
-
/// 判断应用是否运行
-
/// </summary>
-
/// <param name="processName"></param>
-
/// <param name="exit"></param>
-
/// <returns></returns>
-
public static IDisposable Guard(out bool exit)
-
{
-
Process currentProcess = Process.GetCurrentProcess();
-
var processName = currentProcess.ProcessName;
-
Mutex mutex = new Mutex(true, processName, out bool createNew);
-
if (createNew)
-
{
-
exit = false;
-
}
-
else
-
{
-
Process[] processesByName = Process.GetProcessesByName(currentProcess.ProcessName);
-
int num = 0;
-
while (num < (int)processesByName.Length)
-
{
-
Process process = processesByName[num];
-
if (process.Id == currentProcess.Id || !(process.MainWindowHandle != IntPtr.Zero))
-
{
-
num++;
-
}
-
else
-
{
-
WinApiHelper.SetForegroundWindow(process.MainWindowHandle);
-
WinApiHelper.RestoreWindowAsync(process.MainWindowHandle);
-
break;
-
}
-
}
-
exit = true;
-
}
-
return mutex;
-
}
-
private static class WinApiHelper
-
{
-
[SecuritySafeCritical]
-
public static bool IsMaxmimized(IntPtr hwnd)
-
{
-
WinApiHelper.Import.WINDOWPLACEMENT wINDOWPLACEMENT = new WinApiHelper.Import.WINDOWPLACEMENT();
-
if (!WinApiHelper.Import.GetWindowPlacement(hwnd, ref wINDOWPLACEMENT))
-
{
-
return false;
-
}
-
return wINDOWPLACEMENT.showCmd == WinApiHelper.Import.ShowWindowCommands.ShowMaximized;
-
}
-
-
[SecuritySafeCritical]
-
public static bool RestoreWindowAsync(IntPtr hwnd)
-
{
-
return WinApiHelper.Import.ShowWindowAsync(hwnd, (WinApiHelper.IsMaxmimized(hwnd) ? 3 : 9));
-
}
-
-
[SecuritySafeCritical]
-
public static bool SetForegroundWindow(IntPtr hwnd)
-
{
-
return WinApiHelper.Import.SetForegroundWindow(hwnd);
-
}
-
-
private static class Import
-
{
-
[DllImport("user32.dll", CharSet = CharSet.None, ExactSpelling = false)]
-
public static extern bool GetWindowPlacement(IntPtr hWnd, ref WinApiHelper.Import.WINDOWPLACEMENT lpwndpl);
-
-
[DllImport("user32.dll", CharSet = CharSet.None, ExactSpelling = false)]
-
public static extern bool SetForegroundWindow(IntPtr hWnd);
-
-
[DllImport("user32.dll", CharSet = CharSet.None, ExactSpelling = false)]
-
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
-
-
public enum ShowWindowCommands
-
{
-
Hide,
-
Normal,
-
ShowMinimized,
-
ShowMaximized,
-
ShowNoActivate,
-
Show,
-
Minimize,
-
ShowMinNoActive,
-
ShowNA,
-
Restore,
-
ShowDefault,
-
ForceMinimize
-
}
-
-
public struct WINDOWPLACEMENT
-
{
-
public int length;
-
-
public int flags;
-
-
public WinApiHelper.Import.ShowWindowCommands showCmd;
-
-
public Point ptMinPosition;
-
-
public Point ptMaxPosition;
-
-
public Rectangle rcNormalPosition;
-
}
-
}
-
}
-
}
调用的demo如下,亲测可以,若无法实现的请留言讨论(本文章是原创文章,转载请标明,盗版必究,觉得文章对你帮助的可以点个赞表示支持一下,谢谢):
-
static void Main()
-
{
-
using(SingleInstanceApplication.Guard(out bool exit))
-
{
-
if (exit)
-
return;
-
Application.EnableVisualStyles();
-
Application.SetCompatibleTextRenderingDefault(false);
-
Application.Run(new Form1());
-
}
-
}
DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法的更多相关文章
- java——多线程——单例模式的static方法和非static方法是否是线程安全的?
单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static ...
- synchronized 修饰在 static方法和非static方法的区别
Java中synchronized用在静态方法和非静态方法上面的区别 在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法.也可以synchroniz ...
- Java中synchronized 修饰在static方法和非static方法的区别
[问题描述]关于Java中synchronized 用在实例方法和对象方法上面的区别 [问题分析]大家都知道,在Java中,synchronized 是用来表示同步的,我们可以synchronized ...
- 关于C#单例Singleton的看法和使用
首先明白一点,什么是单例模式? 单例模式是指一个类在一个应用程序运行时仅仅实例化一次,以后所有的调用都使用第一次实例化的对象,是应用程序级别的,与session,用户等无关,它比全局参数或静态类方式更 ...
- iOS——Swift开发中的单例设计模式(摘译,非原创)
最近在开发一个小的应用,遇到了一些Objective-c上面常用的单例模式,但是swift上面还是有一定区别的,反复倒来倒去发现不能按常理(正常的oc to swift的方式)出牌,因此搜索了一些帖子 ...
- java static成员变量方法和非static成员变量方法的区别
这里的普通方法和成员变量是指,非静态方法和非静态成员变量首先static是静态的意思,是修饰符,可以被用来修饰变量或者方法. static成员变量有全局变量的作用 非static成员变量则 ...
- 表单元素的submit()方法和onsubmit事件
1.表单元素中出现了name="submit"的元素 2.elemForm.submit();不会触发表单的onsubmit事件 3.动态创建表单时遇到的问题 表单元素拥有subm ...
- 表单元素的submit()方法和onsubmit事件(转)
1.表单元素中出现了name="submit"的元素 2.elemForm.submit();不会触发表单的onsubmit事件 3.动态创建表单时遇到的问题 表单元素拥有subm ...
- static方法和非static方法的区别
●生命周期(Lifecycle):静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关闭. ...
随机推荐
- ffmpeg参数
a) 通用选项 -L license-h 帮助-fromats 显示可用的格式,编解码的,协议的...-f fmt 强迫采用格式fmt-I filename 输入文件-y 覆盖输出文件-t durat ...
- 【串线篇】spring boot自动配置原理
配置文件到底能写什么?怎么写?自动配置原理: 配置文件能配置的属性参照 一.自动配置原理: 1.1.SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfigur ...
- MacOS系統Flutter打包apk
一.打包前需要做一些基本设置的确认 1.应用名 2.权限设置 3.applicationId:应用唯一标识符 4.versionCode:版本号 5.versionName:版本名称 6.APP应用图 ...
- 打开pycharm提示python已停止工作
今天遇到一个棘手的问题: 现象:打开pycharm,立刻提示python已停止工作,关掉后还会弹出一个新的,就是永远维持至少一个提醒框在界面的状态 解决过程: 方法一:然后在网上搜解决办法,有一个主流 ...
- PyTorch 手动提取 Layers
Model NeuralNet( (l0): Linear(in_features=6, out_features=256, bias=True) (relu): ReLU() (bn0): Batc ...
- FastDFS搭建文件管理系统
参考:https://www.cnblogs.com/chiangchou/p/fastdfs.html 目录: 一:FastDFS介绍 1:简介: FastDFS 是一个开源的高性能分布式文件系统( ...
- [CSP-S模拟测试]:回文(hash+二维前缀和)
题目描述 闲着无聊的$YGH$秒掉上面两道题之后,开始思考有趣的回文串问题了. 他面前就有一个漂浮着的字符串.显然$YGH$是会$manacher$的,于是他随手求出了这个字符串的回文子串个数.但是他 ...
- [CSP-S模拟测试]:赛(贪心+三分)
题目描述 由于出题人思维枯竭所以想不出好玩的背景.有$n$个物品,第$i$个物品的价格是$v_i$,有两个人,每个人都喜欢$n$个物品中的一些物品.要求选出正好$m$个物品,满足选出的物品中至少有$k ...
- womenzijide2
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...
- 生产环境下,oracle不同用户间的数据迁移。第二部分
任务名称:生产环境下schema ELON数据迁移至schema TIAN######################################## 测试二:测试参数remap_tablespa ...