方法一:
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
分享到:
相关推荐
winform窗体只运行一个,确保程序只运行一个实例,当该实例已在运行时候,唤醒此实例不会另开一个新的实例
C# WinForm 单实例运行 ,当第二次运行时,激活第一个运行实例。
本例程实现了日志的输出显示和日志文件的记录,包括程序的启动,关闭等系统事件,程序中执行了什么操作,都会窗口显示和后台记录到文件,每天会生成一个带日期的日志文件,程序反复打开不会覆盖记录。适合初学者快速...
C#语言Winform应用程序判定是否已运行实例,采用互斥锁
为了更便于使用,笔者整理了一段自己用的代码,可以判断程序是否在运行,只运行一个实例,而且能实现当程序在运行时,再去双击程序图标,直接呼出已经运行的程序。 下面看代码,只需在程序的入口文件中加如下代码...
在C#Winform中单例程序示例 稍加改变也可用于WPF 可以用于同一程序不同进程的通信
C# 启动C++生成的EXE文件,是否运行判断,只运行一个实例,exe路径和exe名称参数配置在TXT文件中,便于插件使用。
<Windows>> – Single-Instance Applications 这一章中, 学到了调用 VB.Net 中的 IsSingleInstance, 为 C# WinForm 添加只运行应用程序的单个实例 ( Single Instance Application). 是个好方法! 该方法显然从易用...
一个监控powerpoint的实例程序,可直接运行。
实例033 制作一个数字猜猜看小游戏 40 实例034 使用goto语句在数组中搜索指定图书 42 第3章 字符串处理技术 44 3.1 字符及字符串转换 45 实例035 将字母全部转换为大写或小写 45 实例036 字母与ASCII码的转换 46 ...
在WinForm/C#中打开一个文件,主要是用到进程的知识。 下面是一些实例,可以模仿着去实现。 1. 打开文件 2.打开浏览器 3. 打开指定URL 4. 打开文件夹 5.打印文件
1、点击“关闭”按钮时,程序最小化到托盘,并没有退出,这时再次运行程序,不会重复运行,而是显示已运行的程序; 2、支持不同目录; 3、支持修改名称。 代码(不支持修改名称,不支持不同目录): using System; ...
C#实例+计算器+面向对象实现 采用面向对象方式用C#实现,希望对初学者有所帮助,可以直接运行,是CS架构,WINFORM程序
两个实例都是用委托写的实例1是委托方法,实例二是委托button事件,程序代简单易懂,直接运行即可,不过两实例是写在一起的,想要运行哪个实例首先得先把哪个设置成“启动项目”
C#调用C++类实例,附C++类源码,以及C# winform程序源码,可以直接运行
使用vs2015编辑,可以直接运行查看源代码 文字水印可改变水印大小,水印位置,水印透明。 图片水印可改变水印大小,水印位置,水印透明。 内有直接封装好的类可以直接运行,懒人福利
该压缩包中包含13个winform第三方开源控件源码及实例,其中有dockpanel(实现仿VS IDE界面),Group(分组框头显示复选框、单选框、折叠按钮),CollapsibleSplitter(折叠面板),ColorPicker(与WinForm原生的不同,效果...
初步的认识,了解C#的开发环境,编写第一个C#控制台应用程序。C#语言的基本语法和我 们之前的学习的C语言、Java语言一样同属于C语言语法系列,有很多相似的地方,同时也 有一些不同的地方,因此我们在学习的时候需要注意...