前言:在我们做的软件中,当点击图标运行时,正常的需求是只需要启动一个软件的实例,这是非常重要的一点,不然就显得我们的软件非常的山寨,笔者在工作中经常遇到同事没有注意这一点,看是不重要,实则非常的重要,这里在C#中进行实现。

注:代码需写在Program.cs中,具体代码如下:

 static class Program
 {

         /// <summary>
         /// 该函数设置由不同线程产生的窗口的显示状态。
         /// </summary>
         /// <param name="hWnd">窗口句柄</param>
         /// <param name="cmdShow">指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分。</param>
         /// <returns>如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零。</returns>
         [DllImport("User32.dll")]
         private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
         /// <summary>
         /// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。系统给创建前台窗口的线程分配的权限稍高于其他线程。
         /// </summary>
         /// <param name="hWnd">将被激活并被调入前台的窗口句柄。</param>
         /// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零。</returns>
         [DllImport("User32.dll")]
         private static extern bool SetForegroundWindow(IntPtr hWnd);
         ;  //最大化显示窗口
         ;//以原来大小和位置显示

         /// <summary>
         /// 应用程序的主入口点。
         /// </summary>
         [STAThread]
         static void Main()
         {
             Application.EnableVisualStyles();
             Application.SetCompatibleTextRenderingDefault(false);

             Process instance = RunningInstance();

             if (instance == null)
             {
                 LoginForm lf = new LoginForm();
                 lf.ShowDialog();
                 if (lf.DialogResult == DialogResult.OK)
                     Application.Run(new SelectItemForm());
             }
             else
             {
                 HandleRunningInstance(instance);

             }

         }

         /// <summary>
         /// 获取正在运行的实例,没有运行的实例返回null;
         /// </summary>
         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 (process.MainModule.FileName == current.MainModule.FileName)
                     {
                         return process;
                     }
                 }
             }
             return null;
         }

         /// <summary>
         /// 显示已运行的程序。
         /// </summary>
         public static void HandleRunningInstance(Process instance)
         {
             )  //笔者这里根据实际情况,进行了控制
                 ShowWindowAsync(instance.MainWindowHandle, WS_SHOWMAXIMIZE); //显示,通过后面的值可以对窗口大小进行控制
             else
                 ShowWindowAsync(instance.MainWindowHandle, WS_SHOW);

             SetForegroundWindow(instance.MainWindowHandle);            //放到前端
         }
     }

通过以上代码,就可以实现,程序只启动一次,而不是每次点击都会进行一个实例化。

by Shawn Chen 2017.7.10晚

WinForm程序,实现只启动一个实例的更多相关文章

  1. C# 只启动一个实例完全解决方案

    工作上经常会遇到"程序只能启动一个实例"这样的需求. 我想,这样的需求应该很普遍,所以没打算去动脑筋,去找谷歌问下就得了,用下来发现,不是这里不爽就是那里不行. 先说下我详细的几点 ...

  2. windows下程序启动检查,只启动一个实例

    问题来源:http://bbs.csdn.net/topics/390998279?page=1#post-398983061 // Only_once.cpp : 定义控制台应用程序的入口点. // ...

  3. 37.QT-QTSingleApplication-程序只运行一个实例

    QTSingleApplication由Qt官方提供的,用于实现只启动一个实例,并在启动时可以向向另一个实例通信(依赖于QtNetwork模块) QTSingleApplication下载路径:链接: ...

  4. wpf只运行一个实例

    原文:wpf只运行一个实例 在winform下,只运行一个实例只需这样就可以: 1. 首先要添加如下的namespace: using System.Threading; 2. 修改系统Main函数, ...

  5. MFC 只启动一个程序实例

    问题描述: 我们开发过程中可能会经常遇到,只启动一个程序实例.即一个程序启动之后,如果再次执行该程序,将会恢复之前打开的程序,而不是打开一个新的程序. 实现原理:利用FindWindow/FindWi ...

  6. vc++高级班之窗口篇[4]---让程序只运行一个实例

      大家都看过或者使用过类似只运行一个实例的程序,比如:QQ游戏.部分浏览器 等等! 让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建后,有窗口的程序在窗口创建前, 检查系统中是 ...

  7. VC 实现程序只运行一个实例,并激活已运行的程序

    转载:http://blog.sina.com.cn/s/blog_4b44e1c00100bh69.html 进程的互斥运行:CreateMutex函数实现只运行一个程序实例 正常情况下,一个进程的 ...

  8. Linux编程之《只运行一个实例》

    概述 有些时候,我们要求一个程序在系统中只能启动一个实例.比如,Windows自带的播放软件Windows Medea Player在Windows里就只能启动一个实例.原因很简单,如果同时启动几个实 ...

  9. WinFrom 只启动一个exe,并且获得焦点

    只启动一个exe方法: using System; using System.Collections.Generic; using System.Runtime.InteropServices; us ...

随机推荐

  1. python web框架篇:views视图函数

    Django请求的生命周期是怎样的? 简单地说,通过URL对应关系匹配 ->找到对应的函数(或者类)->返回字符串(或者读取Html之后返回渲染的字符串) 解剖起来如下: 1. 当用户在浏 ...

  2. 数据结构中,几种树的结构表示方法(C语言实现)

    //***************************************** //树的多种结构定义 //***************************************** # ...

  3. Leetcode题解(27)

    86. Partition List 题目 分析:题目要求将链表划分为两部分,前半部分小于x,后半部分大于等于x,并且各个数之间的相对顺序不变. 解题思路是:从头开始扫描链表,找打第一个大于等于x的数 ...

  4. Codeforces 376A. Night at the Museum

    A. Night at the Museum time limit per test 1 second memory limit per test 256 megabytes input standa ...

  5. Assigning Workstations

    题目链接:http://vjudge.net/contest/127404#problem/A /* 给你n个数字,让你找出一个最小的数字,这个数字不在这些数字中出现的 ,注意:这个数字如果各个位上的 ...

  6. asp.net core webapi文件上传

    最近开发一个新项目,使用了asp.net core 2.0,采用webapi开发后台,postgresql为数据库.最先来的问题就是上传文件的问题. POST文件的一些坑 使用默认模板创建webapi ...

  7. AngularJS学习篇(十)

    AngularJS Select(选择框) 使用 ng-options 创建选择框 在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,如 ...

  8. Centos7.4下用Docker-Compose部署WordPress(续)-服务器端用Nginx作为反向代理并添加SSL证书(阿里云免费DV证书)

    前言 在我写完Centos7.4下用Docker-Compose部署WordPress这篇文章后,我的个人博客已经正式的开始运作.但考虑到网站访问的安全性以及今后可能会重复利用服务器来部署其他网站的可 ...

  9. 02.JSP内置对象

    一.内置对象:不再由用户进行实例化而可以直接使用的对象,一共九种,一定要清楚的记住每种内置对象的类型,以方便查询文档. 二.四种属性保存范围 1,  属性保存范围:指一个设置的对象,可以经过多少个其他 ...

  10. '@P0'附近有语法错误

    做一个分页查询功能,使用到了TOP #{pagenum}然后就报错了.'@P0'附近有语法错误 未解决:#{pagenum}改成${pagenum},但是mybatis报参数未找到错误, 解决:将对应 ...