做禁止winform多开,在program的Main函数中调用Application.Exit()方法,发现无效,最后改用return实现效果bool blnIsRunning;
Mutex mutexApp = new Mutex(false, Assembly.GetExecutingAssembly().FullName, out blnIsRunning);
if (!blnIsRunning) {
MessageBox.Show("程序已经运行!", Application.ProductName,
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
那Application.Exit用在Program的Main函数中是不是没有意义呢?看了很多人写的禁止多开的代码都在Main函数的if判断中用了Application.Exit,有何作用?
Mutex mutexApp = new Mutex(false, Assembly.GetExecutingAssembly().FullName, out blnIsRunning);
if (!blnIsRunning) {
MessageBox.Show("程序已经运行!", Application.ProductName,
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
那Application.Exit用在Program的Main函数中是不是没有意义呢?看了很多人写的禁止多开的代码都在Main函数的if判断中用了Application.Exit,有何作用?
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Process instance = RunningInstance();
if (instance == null)
{
//没有实例在运行 Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
AboutConfig.InitAppSettings();
//获取数据库连接字符串 *****
Init obj = new Init();
if (!obj.GetConnectionString())
{
MessageBox.Show("无法获取数据库连接字符串!程序中止", Pub.Sys_PromptCaption);
Application.Exit();
return;
}
//if (new fmLogin().ShowDialog() == DialogResult.OK)
//{
// Application.Run(new fmLogin());
//}
//else
//{
// return;
//}
Application.Run(new fmLogin());
//Application.Run(new mytest()); //Application.Run(new XTGL.mdiLuxJieSuo());
////Application.Run(new fmMain());
}
else
{
//已经有一个实例在运行
HandleRunningInstance(instance);
} //if (new test2().ShowDialog() == DialogResult.OK)
//{
// Application.Run(new test2());
//}
//else
//{
// return;
//} } private 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 process; }
}
}
return null;
} private static void HandleRunningInstance(Process instance)
{
MessageBox.Show("已经在运行!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
ShowWindowAsync(instance.MainWindowHandle, 1); //调用api函数,正常显示窗口 SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端
}
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(System.IntPtr hWnd);
}
static void Main()
{
if (DetchIfWMSRunning())
{
Application.Exit();
return;// 加 return 则Running 不会显示
}
MessageBox.Show("Running!");
} static bool DetchIfWMSRunning()
{
string strAppPath = Environment.CurrentDirectory + @"\"; Process currentProcess = Process.GetCurrentProcess();
Process[] WMSProcesses = Process.GetProcessesByName(currentProcess.ProcessName);
foreach (Process p in WMSProcesses)
{
if ((p.Id != currentProcess.Id) && !System.IO.File.Exists(strAppPath + "Test.sln"))
{
return true;
}
}
return false;
}
Exit 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口。该方法并不强制退出该应用程序。
如11楼举的例子
如3楼和11楼的
static void Main()
{
bool bCreatedNewAdjust;
Mutex mAdjust =new Mutex( false, "myUniqueName", out bCreatedNewAdjust );
if( bCreatedNewAdjust )
Application.Run(new frmAdjustMent());
else
MessageBox.Show("すでに起動しています。","仕入調整・返品",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
我也觉得在Main()里面没有必要调用.有知道调用理由的说下啊