摘要
本文闡述了在基於
概述
在開發一些應用系統的時候
進程匹配
對於每一個應用程序運行實例都會包含該實例的一個或多個進程
邏輯處理步驟如下
可見上面的邏輯實現中用於進程匹配的信息是關鍵
在代碼中首先需要引用下面命名空間
using System
把實現唯一運行實例功能的類名取為SingleInstance
public static class SingleInstance {}
使用GetRunningInstance靜態方法獲取應用程序進程實例
public static Process GetRunningInstance()
{
Process currentProcess = Process
//獲取當前運行程序完全限定名
string currentFileName = currentProcess
//獲取進程名為ProcessName的Process數組
Process[] processes = Process
//遍歷有相同進程名稱正在運行的進程
foreach (Process process in processes)
{
if (process
{
if (process
return process;//返回已運行的進程實例
}
}
return null;
}
接下來調用兩個WinAPI
[DllImport(
private static extern bool ShowWindowAsync(IntPtr hWnd
[DllImport(
private static extern bool SetForegroundWindow(IntPtr hWnd);
定義類成員輔助變量
private const int WS_SHOWNORMAL =
以上的方法聲明為私有
public static bool HandleRunningInstance(Process instance)
{
//確保窗口沒有被最小化或最大化
ShowWindowAsync(instance
//設置為foreground window
return SetForegroundWindow(instance
}
對上面的方法創建一個重載版本
public static bool HandleRunningInstance()
{
Process p = GetRunningInstance();
if (p != null)
{
HandleRunningInstance(p);
return true;
}
return false;
}
上面的方法實現獲取已經運行的進程實例的句柄
在Main函數中調用下面代碼實現單一應用程序實例
Process p = SingleInstance
if (p != null) //已經有應用程序副本執行
{
SingleInstance
}
else //啟動第一個應用程序
{
Application
}
簡潔的調用為
if (SingleInstance
{
Application
}
可見
進程互斥
在這個實現方式中需要定義一個進程同步基元
實現步驟如下
在代碼中筆者使用System
在類成員中聲明同步基元
private static Mutex mutex = null;
CreateMutex靜態方法創建應用程序進程Mutex
public static bool CreateMutex()
{
return CreateMutex(Assembly
}
實現其重載方法
public static bool CreateMutex(string name)
{
bool result = false;
mutex = new Mutex(true
return result;
}
對應的釋放Mutex資源方法為
public static void ReleaseMutex()
{
if (mutex != null)
{
mutex
}
}
在Main函數中調用下面代碼實現單一應用程序實例
if (SingleInstance
{
Application
SingleInstance
}
else
{
MessageBox
}
可見
運行標志
使用應用程序運行標志簡單來講就是在程序初始化的時候設置一個標志表示程序已運行
基本步驟如下
對於標志存儲載體可以使用注冊表
聲明類成員標志文件名稱變量
private static string runFlagFullname = null;
初始化程序運行標志
public static bool InitRunFlag()
{
if (File
{
return false;
}
using (FileStream fs = new FileStream(RunFlag
{
}
return true;
}
釋放初始化程序運行標志
public static void DisposeRunFlag()
{
if (File
{
File
}
}
獲取或設置程序運行標志
public static string RunFlag
{
get
{
if(runFlagFullname == null)
{
string assemblyFullName = Assembly
string path = Environment
runFlagFullname = Path
}
return runFlagFullname;
}
set
{
runFlagFullname = value;
}
}
在Main函數中調用下面代碼實現單一應用程序實例
if (SingleInstance
{
Application
SingleInstance
}
else
{
MessageBox
}
可見
功能測試
這一節對上面的三個功能進行測試
根據代碼實現細節不同
[STAThread]
static void Main(string[] args)
{
if (args
{
Process p = SingleInstance
if (p != null) //已經有應用程序副本執行
SingleInstance
else //啟動第一個應用程序
Application
}
else //有多個參數
{
switch (args[
{
case
if (SingleInstance
Application
break;
case
if (args
{
if ( SingleInstance
{
Application
SingleInstance
}
else
//調用SingleInstance
MessageBox
}
else
{
if (SingleInstance
{
Application
SingleInstance
}
else
//調用SingleInstance
MessageBox
}
break;
case
if (args
SingleInstance
try
{
if (SingleInstance
{
Application
SingleInstance
}
else
//調用SingleInstance
MessageBox
}
catch (Exception ex)
{
MessageBox
}
break;
default:
MessageBox
break;
}
}
}
運行CMD命令行
第一種調用為
第二種調用為
第三種調用為
測試結果
備注
針對遠程訪問的測試
更多資源
關於
From:http://tw.wingwit.com/Article/program/net/201311/11652.html