会员
周边
众包
新闻
博问
闪存
赞助商
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式
...
退出登录
注册
登录
清风细雨
润物无声
博客园
首页
新随笔
联系
订阅
管理
只启动一个应用程序实例控制类
using
System;
using
System.IO;
using
System.Diagnostics;
using
System.Threading;
using
System.Reflection;
using
System.Runtime.InteropServices;
namespace
Zhengzuo.CSharpCode
{
/**/
///
<summary>
///
只启动一个应用程序实例控制类
///
</summary>
public
static
class
SingleInstance
{
private
const
int
WS_SHOWNORMAL
=
1
;
[DllImport(
"
User32.dll
"
)]
private
static
extern
bool
ShowWindowAsync(IntPtr hWnd,
int
cmdShow);
[DllImport(
"
User32.dll
"
)]
private
static
extern
bool
SetForegroundWindow(IntPtr hWnd);
//
标志文件名称
private
static
string
runFlagFullname
=
null
;
//
声明同步基元
private
static
Mutex mutex
=
null
;
/**/
///
<summary>
///
static Constructor
///
</summary>
static
SingleInstance()
{
}
api实现
#region
api实现
/**/
///
<summary>
///
获取应用程序进程实例,如果没有匹配进程,返回Null
///
</summary>
///
<returns>
返回当前Process实例
</returns>
public
static
Process GetRunningInstance()
{
Process currentProcess
=
Process.GetCurrentProcess();
//
获取当前进程
//
获取当前运行程序完全限定名
string
currentFileName
=
currentProcess.MainModule.FileName;
//
获取进程名为ProcessName的Process数组。
Process[] processes
=
Process.GetProcessesByName(currentProcess.ProcessName);
//
遍历有相同进程名称正在运行的进程
foreach
(Process process
in
processes)
{
if
(process.MainModule.FileName
==
currentFileName)
{
if
(process.Id
!=
currentProcess.Id)
//
根据进程ID排除当前进程
return
process;
//
返回已运行的进程实例
}
}
return
null
;
}
/**/
///
<summary>
///
获取应用程序句柄,设置应用程序前台运行,并返回bool值
///
</summary>
public
static
bool
HandleRunningInstance(Process instance)
{
//
确保窗口没有被最小化或最大化
ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
//
设置真实例程为foreground window
return
SetForegroundWindow(instance.MainWindowHandle);
}
/**/
///
<summary>
///
获取窗口句柄,设置应用程序前台运行,并返回bool值,重载方法
///
</summary>
///
<returns></returns>
public
static
bool
HandleRunningInstance()
{
Process p
=
GetRunningInstance();
if
(p
!=
null
)
{
HandleRunningInstance(p);
return
true
;
}
return
false
;
}
#endregion
Mutex实现
#region
Mutex实现
/**/
///
<summary>
///
创建应用程序进程Mutex
///
</summary>
///
<returns>
返回创建结果,true表示创建成功,false创建失败。
</returns>
public
static
bool
CreateMutex()
{
return
CreateMutex(Assembly.GetEntryAssembly().FullName);
}
/**/
///
<summary>
///
创建应用程序进程Mutex
///
</summary>
///
<param name="name">
Mutex名称
</param>
///
<returns>
返回创建结果,true表示创建成功,false创建失败。
</returns>
public
static
bool
CreateMutex(
string
name)
{
bool
result
=
false
;
mutex
=
new
Mutex(
true
, name,
out
result);
return
result;
}
/**/
///
<summary>
///
释放Mutex
///
</summary>
public
static
void
ReleaseMutex()
{
if
(mutex
!=
null
)
{
mutex.Close();
}
}
#endregion
设置标志实现
#region
设置标志实现
/**/
///
<summary>
///
初始化程序运行标志,如果设置成功,返回true,已经设置返回false,设置失败将抛出异常
///
</summary>
///
<returns>
返回设置结果
</returns>
public
static
bool
InitRunFlag()
{
if
(File.Exists(RunFlag))
{
return
false
;
}
using
(FileStream fs
=
new
FileStream(RunFlag, FileMode.Create))
{
}
return
true
;
}
/**/
///
<summary>
///
释放初始化程序运行标志,如果释放失败将抛出异常
///
</summary>
public
static
void
DisposeRunFlag()
{
if
(File.Exists(RunFlag))
{
File.Delete(RunFlag);
}
}
/**/
///
<summary>
///
获取或设置程序运行标志,必须符合Windows文件命名规范
///
这里实现生成临时文件为依据,如果修改成设置注册表,那就不需要符合文件命名规范。
///
</summary>
public
static
string
RunFlag
{
get
{
if
(runFlagFullname
==
null
)
{
string
assemblyFullName
=
Assembly.GetEntryAssembly().FullName;
//
CommonApplicationData:
//
"C:\\Documents and Settings\\All Users\\Application Data"
string
path
=
Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
//
"C:\\Program Files\\Common Files"
//
string path = Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles);
runFlagFullname
=
Path.Combine(path, assemblyFullName);
}
return
runFlagFullname;
}
set
{
runFlagFullname
=
value;
}
}
#endregion
}
}
posted @
2007-11-01 22:20
轮回
阅读(
315
) 评论(
0
)
编辑
收藏
举报
会员力量,点亮园子希望
刷新页面
返回顶部
公告