方法一:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Reflection;
namespace WinFormStudy
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Process instance = RunningInstance();
if (instance == null)
{
//没有实例在运行
Application.Run(new Form1());
}
else
{
//已经有一个实例在运行
HandleRunningInstance(instance);
}
}
#region 确保程序只运行一个实例
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);
#endregion
}
}
方法二:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace WinFormStudy
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
bool ret;
System.Threading.Mutex m = new System.Threading.Mutex(true, Application.ProductName, out ret);
if (ret)
{
System.Windows.Forms.Application.EnableVisualStyles(); //这两行实现 XP 可视风格
System.Windows.Forms.Application.DoEvents();
System.Windows.Forms.Application.Run(new Form1());
// frmMain 为你程序的主窗体,如果是控制台程序不用这句
m.ReleaseMutex();
}
else
{
MessageBox.Show(null, "有一个和本程序相同的应用程序已经在运行,请不要同时运行多个本程序。\n\n这个程序即将退出。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
// 提示信息,可以删除。
Application.Exit();//退出程序
}
}
}
}
转自:http://www.cnblogs.com/freeliver54/archive/2008/11/22/1338816.html
分享到:
相关推荐
在C#编程中,开发Windows桌面应用程序时,我们可能会遇到这样的需求:确保用户只能打开一个WinForm应用程序实例。这通常是为了防止多个实例同时运行导致的数据冲突或其他问题。本篇文章将详细探讨如何实现C# WinForm...
C# 只能运行一个winForm进程是指在C#中实现单实例应用程序,确保同一个应用程序只能运行一个实例,以避免资源浪费和混乱。下面将详细介绍如何实现单实例应用程序。 单实例应用程序的实现 在C#中,实现单实例应用...
《C# WinForm实例大全》是一份集合了198个Csharp WinForm应用程序实例的资源库,旨在帮助开发者深入理解和掌握C#编程语言在Windows桌面应用开发中的实践技巧。WinForm是.NET Framework中用于创建图形用户界面(GUI)...
每个实例都代表了一个特定的技术点,通过查看源代码并运行程序,开发者可以深入理解各种功能的实现方法,进而提升自己的编程技能。这些实例对于初学者来说是宝贵的自学材料,对于有经验的开发者则是快速解决问题的...
C# WinForm是.NET框架中的一个重要组成部分,它提供了丰富的用户界面开发工具,使得开发者可以构建出功能强大、界面友好的桌面应用程序。这份“C# WinForm实例大全”包含了198个经典实例,覆盖了从基础控件操作到...
在C#编程领域,Windows Forms(WinForm)是一种常见的用于构建桌面应用程序的框架。这个"经典C# WinForm实例"集合提供了一些实用的代码示例,可以帮助开发者掌握WinForm的基本用法以及一些高级技巧。下面将详细介绍...
C#是一种广泛应用于Windows桌面应用开发...每一个实例都是一个小型的项目,通过实际运行和调试,有助于加深对C#语法和WinForm框架的理解。无论是初学者还是经验丰富的开发者,这个资源库都能提供宝贵的学习和参考资料。
本文将详细解释如何实现Winform程序只允许运行一个实例,并提供三种不同的方法来实现这一功能。 #### 方法一:使用Mutex对象 这种方法利用了Windows操作系统提供的Mutex(互斥锁)机制来限制程序的多次启动。Mutex...
标题中的“198个经典C# WinForm实例源码(超赞).7z”指的是一个包含198个C#编程语言实现的Windows Forms(WinForm)应用程序实例的压缩包。这些实例对于正在学习C#和WinForm开发的开发者来说,是极具价值的学习资源。...
对于C#新手而言,这是一个很好的起点,能够帮助他们快速上手;而对于有经验的开发者,这些实例同样能提供新的灵感和解决问题的方法。总之,这个资源库对任何想要深入理解C# WinForm开发的人来说都是极其宝贵的。
WinForm是.NET Framework中的一个组件,用于创建桌面应用程序的用户界面。 1. C#基础语法:C#的基础包括变量、数据类型、运算符、控制流(如if语句、for循环、while循环)和函数。通过这些实例,初学者可以深入理解...
在C# WinForm开发中,有时我们需要集成或调用系统中已经安装的第三方应用程序,以扩展我们应用程序的功能或提供更多的用户交互。这个实例将详细讲解如何在C# WinForm应用中实现这一目标。 首先,我们需要了解`...
在本文中,我们将深入探讨如何使用C# WinForm开发一个定时开启和关闭小程序。这个程序允许用户设置定时任务,以精确到秒的精度自动启动或关闭指定的应用程序。要实现这样的功能,我们需要理解C#的基础知识,WinForm...
在C#编程中,WinForm应用经常需要实现窗口最小化时隐藏到系统托盘区的功能,这能够提供更好的用户体验,使应用程序在用户不主动关闭时仍然保持后台运行。本实例"**C# WinForm最小化隐藏到托盘实例**"正是针对这一...
### Winform只允许打开一个实例 在Windows Forms(Winform)应用程序开发中,有时我们希望程序只能运行一个实例,即用户不能重复启动该程序。这种需求常见于许多单例模式的应用场景,例如系统托盘程序、后台服务等...
这个“一个不错的C# WinForm程序示例”是你的老师所创建的,其目的是为了教学,帮助初学者更好地理解和实践C#与WinForm的结合使用。 在C#中,WinForm是通过控件来构建用户界面的,如按钮、文本框、标签、列表视图等...
winform窗体只运行一个,确保程序只运行一个实例,当该实例已在运行时候,唤醒此实例不会另开一个新的实例
每个实例源码都会包含一个或多个关键知识点,通过阅读代码、运行程序并理解其工作原理,你可以快速提升C# WinForm编程技能。同时,这也是一个很好的实践平台,可以帮助你理解和运用面向对象设计原则,例如封装、继承...
"198个经典C# WinForm实例源码(超赞).zip"是一个集合了198个C# WinForm应用程序的源代码库,对于初学者和有经验的开发者来说,都是一个宝贵的资源。 1. **C#基础概念**:WinForm是.NET Framework的一部分,用于构建...