在普通的单实例中,第二次点击软件快捷方式的时候,往往简单提示"系统已经运行",而不是把第一次打开的软件主窗体显示出来,下面演示如果主窗体已经打开则把第一次打开的主窗体放置到最前面;

第一步 通过Spy++ 找到窗体句柄和标题:

在寻找窗体句柄时,一般会有下面几种情况:

1.知道类名称和窗体名称,这种是最简单的

2.知道类名称,知道主窗体的名称一部分,但主窗体名称会发生改变

3.不知道类名称,只知道窗体名称,这个时候判断条件只判断名称

4.只知道类名称,不知道窗体名称 这个时候窗体名称设置为Null

第二步 在程序的入口添加单实例判断,如果已经存在该程序,则找到原来程序句柄并打开,这里我默认的是最大化窗体,可以直接修改参数,是最大化还是常规模式;

下面有完整的源码下载!

补充:这个功能也可以移植主界面作为热键;

具体参考华聪老师的博客:

http://www.cnblogs.com/wuhuacong/archive/2011/10/13/2211008.html

       /// <summary>
/// 查找窗体句柄 遍历所有窗体
/// 因为类名称相同的窗体很多
/// </summary>
/// <param name="a_strClassName">类名称</param>
/// <param name="a_strWindowName">窗体名称 因为有时候窗体名称会变动,所以传递前面一部分值 或者整个值 </param>
/// <returns></returns>
public static IntPtr FindWindowExPtr(string a_strClassName, string a_strWindowName)
{
CSharpAPIsDemo aa = new CSharpAPIsDemo();
CSharpAPIsDemo.WindowInfo[] wf = aa.GetAllDesktopWindows();
foreach (CSharpAPIsDemo.WindowInfo info in wf)
{
if (info.szClassName == a_strClassName && info.szWindowName.Contains(a_strWindowName))
{
return info.hWnd;
}
}
return IntPtr.Zero;
}
  /// <summary>
/// 窗体最大化
/// </summary>
/// <param name="a_ptr">窗体句柄</param>
/// <param name="a_intState">1为正常 2为最小化 3 为最大化</param>
public static void SetFormMax(IntPtr a_ptr, int a_intState = )
{
ShowWindow(a_ptr, ); //设置窗体大小 1为正常 2为最小化 3 为最大化
SetWindowPos(a_ptr, -, , , , , SWP_NOSIZE | SWP_NOMOVE); //最后参数也有用1 | 4
SetForegroundWindow(a_ptr);
}

点击推荐后下载完整代码

C# WinForm API 改进单实例运行的更多相关文章

  1. WinForm 登录窗体 + 单实例运行

    关于怎么在winform里增加登录窗体或者如何让winform程序单实例运行网上都很多例子. 然而两者结合起来呢? //Program.cs static class Program { public ...

  2. Winform 单实例运行

    Winform 单实例运行 前言 前两天在博客园看到<如何防止程序多次运行>,文章写的很好,最后还留下一个问题给我们思考.关于Winform的防止多次运行,曾经也想研究过,但是后来工作上没 ...

  3. DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法

    原文:DevExpress Winform使用单例运行程序方法和非DevExpress使用Mutex实现程序单实例运行且运行则激活窗体的方法 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA ...

  4. Qt实现应用程序单实例运行--LocalServer方式

    使Qt应用程序能够单实例运行的典型实现方法是使用共享内存实现.该方法实现简单,代码简洁. 但有一个致命缺陷:共享内存(QSharedMemory)实现的单程序运行,当运行环境是UNIX时,并且程序不幸 ...

  5. Windows进程单实例运行

    场景         Windows进程单实例运行,如果有进程没有退出,继续等待,直到进程完全退出,才会进入下一个实例 HANDLE pHandle = NULL; do  {  pHandle = ...

  6. C#实现单实例运行

    C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 Mutex 原子操作,上面几种方法中, 综合考虑利用 ...

  7. C++实现程序单实例运行的两种方式

    简介 在我们编写程序的时候,经常会注意到的一个问题就是如何能够让程序只运行一个实例,确保不会让同一个程序多次运行,从而产生诸多相同进程,给我们的带来不便呢?那么常用的有以下四种方法,第一种方法是通过扫 ...

  8. c#设计应用程序单实例运行

    利用WindowsFormsApplicationBase的IsSingleInstance来控制应用程序只能单实例运行. [DllImport("user32.dll", Ent ...

  9. c# 单实例运行

    /// <summary> /// 单实例运行程序 /// </summary> static void SingleInstanceRun() { bool isAppRun ...

随机推荐

  1. jenkins+docker+docker machine 远程部署

    dotnet publish -c Release docker build -t microtest:1.0 --build-arg microport=1000 -f "$WORKSPA ...

  2. db事务级别及锁

    相关sql 事务A BEGIN TRANSACTION --执行修改 获取排他锁 UPDATE Product SET Price = 10 WHERE Id = 1 --阶段2 UPDATE Pro ...

  3. 工作中的Buff加成-结构化思考力:自创独门武功 3-3-3原则

    3-3-3原则 3秒钟 *思考三秒钟 沟通前根据交谈内容思考3秒钟,思考下具体需要表达什么,思考的主要点为What.Why.How. *冷静三秒钟 在沟通过程中,若遇到气氛不和谐,比如生气.愤恨等时, ...

  4. ftp服务器PDF文件在线查看

    曾做过电厂的项目,有一些功能需要和甲方的厂家对接,其中就有需要实现甲方ftp服务器上的PDF.JPG等文件的查看功能.就PDF文件为例,这里使用的是pdf插件,需要将参数通过链接发给ftp,获取到PD ...

  5. [AGC003F] Fraction of Fractal 矩阵快速幂

    Description ​ SnukeSnuke从他的母亲那里得到了生日礼物--一个网格.网格有HH行WW列.每个单元格都是黑色或白色.所有黑色单元格都是四联通的,也就是说,只做水平或垂直移动且只经过 ...

  6. 洛谷P3806 【模板】点分治1

    题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行每行询问一个K 输出格式: 对于 ...

  7. php中递归查找父级名称

    /** * 获取所属公司 * @param array 列表 * @param $id 上级ID * @return array */ private static function get_top_ ...

  8. 性能测试—JMeter 常用元件(二)

    性能测试—JMeter 常用元件(二) <零成本web性能测试>第三章 Web性能测试脚本录制与开发中JMeter常用测试元件 测试计划描述了JMeter运行时将会执行的一系列步骤,一个完 ...

  9. 2016级算法第五次上机-E.AlvinZH的学霸养成记IV

    1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...

  10. 2016级算法第五次上机-B.Bamboo&APTX4844魔发药水

    Bamboo&APTX4844魔发药水 题意 "于是,Bamboo耐着性子,看巫师从袖子里掏出 M 瓶时光泉水和 K 粒绿色能量.每瓶时光泉水重量为 c ,生发效果为 l:每粒绿色能 ...