因为任何时候只有一个实例,所以在实现这种功能的时候必须借助只能被独享的资源。如果我们的程序是基于某个平台的,那么就可以借助操作系统的内核对象来完成,比如Windows操作系统就提供了CreateMutex这个API来创建一个独享的内核对象。
解决方案 »
- C# winform 实现弹出的等待对话框
- 数组遍历取下标
- C#中的Timer控件怎么样清零
- 如何对C#.NET中的TextBox输入完成按<回车>后能直接执行ImagesButton服务器控件里的代码?
- 昨天看到这样一个问题,竟然没一个人能答得上,这里真是价值人才汇集啊!!!!!!!!!!!
- 如何用SQL服务器的域名连接数据库
- 请教一个Access数据库的问题
- 强烈推荐源代码:Office 2007 Ribbon风格的菜单按钮 [不看别后悔啊:)]
- 请教高手:怎样在C#中调用完JSP的方法还能返回调用C#的方法!
- 终于都跳到做C#的工作了,散分!
- DataGrid记录重复显示的问题,急死...............
- WEB程序用WMI读取网卡地址的一点问题。请各位帮我看一下。
把初始化方法设为私有,包含一个静态的自身变量,添加一个获取进程的静态方法.
class SingletonDemo
{
private static SingletonDemo theSingleton = null;private SingletonDemo() {}public static SingletonDemo Instance()
{
if (null == theSingleton)
{
theSingleton = new SingletonDemo();
}
return theSingleton;
}
}
初始化对象时直接调用此方法
SingletonDemo s1 = SingletonDemo.Instance();
SingletonDemo s2 = SingletonDemo.Instance();
if (s1.Equals(s2))
...
public abstract class OneInstance
{
/// <summary>
/// 用来判断一个指定的程序是否正在运行
/// </summary>
/// <param name="appId">程序名称,长一点比较好,防止有重复</param>
/// <returns>如果程序是第一次运行返回True,否则返回False</returns>
public static bool IsFirst(string appId)
{
bool ret=false;
if(OpenMutex(0x1F0001,0,appId)==IntPtr.Zero)
{
CreateMutex(IntPtr.Zero,0,appId);
ret=true;
}
return ret;
} [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
private static extern IntPtr OpenMutex(
uint dwDesiredAccess, // access
int bInheritHandle, // inheritance option
string lpName // object name
); [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
private static extern IntPtr CreateMutex(
IntPtr lpMutexAttributes, // SD
int bInitialOwner, // initial owner
string lpName // object name
);
}
static void Main()
{
//防止程序多次运行
if(!OneInstance.IsFirst("你的程序名称"))
{
MessageBox.Show ("你的程序已经在运行中!!");
return;
} Application.Run(new Form1());
}
思路,我们在运行程序前,查找进程中是否有同名的进程,同时运行位置也相同,如是没有运行该程序,如果有,就将同名的同位置的程序窗口置前.主要代码:
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName (current.ProcessName);
//查找相同名称的进程
foreach (Process process in processes)
{
//忽略当前进程
if (process.Id != current.Id)
{
//确认相同进程的程序运行位置是否一样.
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
{
//Return the other process instance.
return process;
}
}
}
//No other instance was found, return null.
return null;
}