java实例代码:基于.Net平台唯一运行实例C#代码实现



作者:郑佐
时间:2006-7-2


概述
本文是针对基于.Net平台应用运行例子实现补充文章给出功能实现代码其中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
{
}


#region api实现
/// <summary>
///
获取应用进程例子,如果没有匹配进程返回Null
/// </summary>
/// <s>
返回当前Process例子</s>
public Process GetRunningInstance
{


Process currentProcess = Process.GetCurrentProcess;//获取当前进程
//获取当前运行完全限定名
currentFileName = currentProcess.MainModule.FileName;
//
获取进程名为ProcessNameProcess
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
{
Process p = GetRunningInstance;
(p != null)
{
HandleRunningInstance(p);
true;
}
false;
}


#endregion


#region Mutex实现
/// <summary>
///
创建应用进程Mutex
/// </summary>
/// <s>
返回创建结果true表示创建成功false创建失败</s>
public bool CreateMutex
{
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
{
(mutex != null)
{
mutex.Close;
}
}


#endregion


#region 设置标志实现
/// <summary>
///
运行标志如果设置成功返回true已经设置返回false设置失败将抛出异常
/// </summary>
/// <s>
返回设置结果</s>
public bool InitRunFlag
{
(File.Exists(RunFlag))
{
false;
}
using (FileStream fs = FileStream(RunFlag, FileMode.Create))
{
}
true;
}


/// <summary>
///
释放运行标志如果释放失败将抛出异常
/// </summary>
public void DisposeRunFlag
{
(File.Exists(RunFlag))
{
File.Delete(RunFlag);
}
}










/// <summary>
/// 获取或设置运行标志必须符合Windows文件命名规范标准
/// 这里实现生成临时文件为依据如果修改成设置注册表那就不需要符合文件命名规范标准
/// </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;
}

{
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( 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;
}

{
//
SingleInstance.HandleRunningInstance思路方法显示到前台
MessageBox.Show("已经运行!");
}
}

{
(SingleInstance.CreateMutex)
{
RunApplication;
SingleInstance.ReleaseMutex;
}

{
//
SingleInstance.HandleRunningInstance思路方法显示到前台
MessageBox.Show("已经运行!");
}
}
;
"-flag"://
使用该方式需要在退出时
(args.Length >= 2) //参数中传入运行标志文件名称
{
SingleInstance.RunFlag = args[1];
}
try
{
(SingleInstance.InitRunFlag)
{
RunApplication;
SingleInstance.DisposeRunFlag;
}

{
//
SingleInstance.HandleRunningInstance思路方法显示到前台
MessageBox.Show("已经运行!");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.);
}
;
default:
MessageBox.Show("
应用参数设置失败");
;
}
}
}


//启动应用
void RunApplication
{
Application.EnableVisualStyles;
Application.Run( MainForm);
}
}
}


功能测试
功能测试类别包括下面 5类
1.本地系统同应用目录;
2.本地系统同应用修改运行文件名称使两次运行名称区别;
3.本地系统两次运行目录区别不修改文件名称;
4.本地系统区别会话用户登录启动应用
5.远程计算机访问启动应用(在远程另个在本地) 运行CMD命令行
方式:
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异常
根据测试结果可见 3种实现方式适用范围区别理想实现是结合他们优点进行多点判断

更多资源
有关.NET平台应用开发更多技术文章可以访问http://blog.csdn.net/zhzuo对于本文建议或意见可在网站WebSite上留言



Tags:  php实例代码 vb实例代码 代码实例 java实例代码

延伸阅读

最新评论

发表评论