java实例代码:基于.Net平台唯一运行实例C#代码实现
作者:郑佐
时间:2006-7-2
概述本文是针对
基于.Net平台应用
唯
运行例子实现![](/icons/89740smhr.gif)
补充
文章给出功能实现代码
其中SingleInstance类实现只允许
个例子运行
Program为测试主
入口
在代码中标识介绍说明文字
主要代码SingleInstance.cs文件
using
;using
.IO;using
.Diagnostics;using
.Threading;using
.Reflection;using
.Runtime.InteropServices;/*------------------------------------------------
郑佐 2006-07-01 http://blog.csdn.net/zhzuo
--------------------------------------------------*/
Zhengzuo.CSharpCode
{
/// <summary>
/// 只启动
个应用
例子控制类 /// </summary>
public
SingleInstance
{
private const
WS_SHOWNORMAL = 1;
[DllImport("User32.dll")]
private
extern bool ShowWindowAsync(IntPtr hWnd,
cmdShow);
[DllImport("User32.dll")]
private
extern bool SetForegroundWindow(IntPtr hWnd);
//标志文件名称 private
runFlagFullname = null;
//声明同步基元 private
Mutex mutex = null;
/// <summary>
///
Constructor
/// </summary>
SingleInstance![](/icons/89740kh.gif)
{
}
#region api实现
/// <summary>
/// 获取应用
进程例子,如果没有匹配进程
返回Null /// </summary>
/// <
s>返回当前Process例子</
s> public
Process GetRunningInstance![](/icons/89740kh.gif)
{
Process currentProcess = Process.GetCurrentProcess
;//获取当前进程 //获取当前运行
完全限定名
currentFileName = currentProcess.MainModule.FileName;
//获取进程名为ProcessName
Process![](/icons/89740shuzu.gif)
Process
processes = Process.GetProcessesByName(currentProcess.ProcessName);
//遍历有相同进程名称正在运行
进程 foreach (Process process in processes)
{
(process.MainModule.FileName
currentFileName)
{
(process.Id != currentProcess.Id)//根据进程ID排除当前进程
process;//返回已运行
进程例子 }
}
null;
}
/// <summary>
/// 获取应用
句柄
设置应用
前台运行
并返回bool值 /// </summary>
public
bool HandleRunningInstance(Process instance)
{
//确保窗口没有被最小化或最大化 ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
//设置真例子程为foreground window
SetForegroundWindow(instance.MainWindowHandle);
}
/// <summary>
/// 获取窗口句柄
设置应用
前台运行
并返回bool值
重载思路方法 /// </summary>
/// <
s></
s>
public
bool HandleRunningInstance![](/icons/89740kh.gif)
{
Process p = GetRunningInstance
;
(p != null)
{
HandleRunningInstance(p);
true;
}
false;
}
#endregion
#region Mutex实现
/// <summary>
/// 创建应用
进程Mutex /// </summary>
/// <
s>返回创建结果
true表示创建成功
false创建失败
</
s> public
bool CreateMutex![](/icons/89740kh.gif)
{
CreateMutex(Assembly.GetEntryAssembly
.FullName);
}
/// <summary>
/// 创建应用
进程Mutex /// </summary>
/// <param name="name">Mutex名称</param> /// <
s>返回创建结果
true表示创建成功
false创建失败
</
s> public
bool CreateMutex(
name)
{
bool result = false;
mutex =
Mutex(true, name, out result);
result;
}
/// <summary>
/// 释放Mutex /// </summary>
public
void ReleaseMutex![](/icons/89740kh.gif)
{
(mutex != null)
{
mutex.Close
;
}
}
#endregion
#region 设置标志实现
/// <summary>
///
化
运行标志
如果设置成功
返回true
已经设置返回false
设置失败将抛出异常 /// </summary>
/// <
s>返回设置结果</
s> public
bool InitRunFlag![](/icons/89740kh.gif)
{
(File.Exists(RunFlag))
{
false;
}
using (FileStream fs =
FileStream(RunFlag, FileMode.Create))
{
}
true;
}
/// <summary>
/// 释放
化
运行标志
如果释放失败将抛出异常 /// </summary>
public
void DisposeRunFlag![](/icons/89740kh.gif)
{
(File.Exists(RunFlag))
{
File.Delete(RunFlag);
}
}
/// <summary>
/// 获取或设置
运行标志
必须符合Windows文件命名规范标准
/// 这里实现生成临时文件为依据
如果修改成设置注册表
那就不需要符合文件命名规范标准![](/icons/89740dou2.gif)
/// </summary>
public
RunFlag
{
get {
(runFlagFullname
null)
{
assemblyFullName = Assembly.GetEntryAssembly
.FullName;
//CommonApplicationData://"C:\\Documents and Settings\\All Users\\Application Data"
path = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
//"C:\\Program Files\\Common Files"
//
path = Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles);
runFlagFullname = Path.Combine(path, assemblyFullName);
}
runFlagFullname;
}
![](/icons/89740set.gif)
{
runFlagFullname = value;
}
} #endregion }
}
Program.cs文件
using
;using
.Windows.Forms;using
.Diagnostics;using Zhengzuo.CSharpCode;/*------------------------------------------------
郑佐 2006-07-01 http://blog.csdn.net/zhzuo
--------------------------------------------------*/
Zhengzuo.Test.WinGui
{
Program
{
[STAThread]
void Main(![](/icons/89740string.gif)
args)
{
(args.Length
0) //没有传送参数 {
Process p = SingleInstance.GetRunningInstance
;
(p != null) //已经有应用
副本执行 {
SingleInstance.HandleRunningInstance(p);
}
//启动第
个应用
{
RunApplication
;
}
}
//有多个参数 {
switch (args[0].ToLower
)
{
"-api":
(SingleInstance.HandleRunningInstance
false)
{
RunApplication
;
}
;
"-mutex":
(args.Length >= 2) //参数中传入互斥体名称 {
( SingleInstance.CreateMutex(args[1]) )
{
RunApplication
;
SingleInstance.ReleaseMutex
;
}
![](/icons/89740else.gif)
{
//
SingleInstance.HandleRunningInstance
思路方法显示到前台
MessageBox.Show("
已经运行!");
}
}
![](/icons/89740else.gif)
{
(SingleInstance.CreateMutex
)
{
RunApplication
;
SingleInstance.ReleaseMutex
;
}
![](/icons/89740else.gif)
{
//
SingleInstance.HandleRunningInstance
思路方法显示到前台
MessageBox.Show("
已经运行!");
}
}
;
"-flag"://使用该方式需要在
退出时
(args.Length >= 2) //参数中传入运行标志文件名称 {
SingleInstance.RunFlag = args[1];
}
try
{
(SingleInstance.InitRunFlag
)
{
RunApplication
;
SingleInstance.DisposeRunFlag
;
}
![](/icons/89740else.gif)
{
//
SingleInstance.HandleRunningInstance
思路方法显示到前台
MessageBox.Show("
已经运行!");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.![](/icons/89740ToString.gif)
);
}
;
default:
MessageBox.Show("应用
参数设置失败
");
;
}
}
}
//启动应用
void RunApplication![](/icons/89740kh.gif)
{
Application.EnableVisualStyles
;
Application.Run(
MainForm
);
}
}
}功能测试
功能测试类别包括下面 5类![](/icons/89740dou.gif)
1.本地系统同
应用
目录;
2.本地系统同
应用
修改运行文件名称使两次运行名称区别;
3.本地系统两次运行
目录区别
不修改文件名称;
4.本地系统区别会话用户登录启动应用
;
5.远程计算机
访问启动应用
(
个
在远程另
个在本地)
运行CMD命令行![](/icons/89740dou.gif)
第
种
方式:
WindowsApplication1.exe
或 WindowsApplication1.exe –api
第 2种
方式:
WindowsApplication1.exe –mutex
或WindowsApplication1.exe –mutex {F140AE26-626C-42f8-BD49-45025742205E}
第 3种
方式:
WindowsApplication1.exe –flag
或WindowsApplication1.exe –flag c:\blog.csdn.net.zhzuo
测试结果,
匹配/互斥/标志
1同
目录
2修改名称
3区别目录
4区别用户
5远程访问
1同
目录
O/O/O
2修改名称
X/O/O
3区别目录
X/O/O
4区别用户
#/X/O
5远程访问
X/O/O
备注:O - 表示成功
X – 表示失败
# -
第 2个运行没有反应
针对远程访问
测试
需要在系统管理工具
.NET Framework 2.0 Configuration中进行设置授权该局域网路径允许访问
否则会抛出
.Security.SecurityException异常![](/icons/89740dou2.gif)
根据测试结果可见 3种实现方式适用范围区别
理想
实现是结合他们
优点进行多点判断![](/icons/89740dou2.gif)
更多资源有关.NET平台应用
开发
更多
技术文章可以访问http://blog.csdn.net/zhzuo
对于本文
建议或意见可在网站WebSite上留言
延伸阅读
- 2010-12-9-- php实例代码,php生成xml简单实例代码
- 2010-12-9-- php实例代码,php 上传功能实例代码
- 2010-12-9-- php实例代码,在PHP中操作Excel实例代码
- 2010-12-9-- php实例代码,PHP类的使用 实例代码讲解
- 2010-12-9-- 网站分析实例,PHP网站实例分析
- 2010-12-9-- php留言本代码,简单的PHP留言本实例代码
- 2010-12-9-- php实例代码,php读取xml实例代码
- 2010-12-9-- gzip压缩,PHP开启gzip页面压缩实例代码
- 2010-12-9-- php验证码代码,php 验证码实例代码
- 2010-12-9-- asp读取xml,asp读取xml实例代码
最新评论