摘要

接着介绍项目中用到的一些方法,在winform中,打好包,有时并不允许运行多个客户端,要保证只有一个客户端运行。如果已经运行了,则弹出已运行的窗口,使其展示。

方法

判断是否有相同的进程

   /// <summary>  /// 获取当前是否具有相同进程。  /// </summary>  /// <returns></returns>  public static Process GetRunningInstance(){Process current = Process.GetCurrentProcess();Process[] processes = Process.GetProcessesByName(current.ProcessName);//遍历正在有相同名字运行的例程     foreach (Process process in processes){//忽略现有的例程     if (process.Id != current.Id)//确保例程从EXE文件运行   if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)return process;}return null;}

在Main函数中,进行判断

        /// <summary>/// 应用程序的主入口点。/// </summary>
        [STAThread]static void Main(){try{Process instance = GetRunningInstance();Application.SetCompatibleTextRenderingDefault(false);if (instance == null){Run();}else{ShowWindowAsync(instance.MainWindowHandle, SW_SHOWNOACTIVATE);  //调用api函数,正常显示窗口SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端
                }}catch (Exception ex){LogInfoData.WriteLog(new LogInfo { Message = ex.Message, Op = "start_app_err" });MessageBox.Show("系统启动出现异常,请重新启动");}}

windows API

     private const int SW_HIDE = 0;private const int SW_NORMAL = 1;private const int SW_MAXIMIZE = 3;private const int SW_SHOWNOACTIVATE = 4;private const int SW_SHOW = 5;private const int SW_MINIMIZE = 6;private const int SW_RESTORE = 9;private const int SW_SHOWDEFAULT = 10;[DllImport("User32.dll")]private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);[DllImport("User32.dll")]private static extern bool SetForegroundWindow(System.IntPtr hWnd);

在使用SetForegroundWindow需要注意以下几点:

The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:

  • The process is the foreground process.
  • The process was started by the foreground process.
  • The process received the last input event.
  • There is no foreground process.
  • The process is being debugged.
  • The foreground process is not a Modern Application or the Start Screen.
  • The foreground is not locked (see LockSetForegroundWindow).
  • The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
  • No menus are active.

An application cannot force a window to the foreground while the user is working with another window. Instead, Windows flashes the taskbar button of the window to notify the user.

A process that can set the foreground window can enable another process to set the foreground window by calling the AllowSetForegroundWindowfunction. The process specified by dwProcessId loses the ability to set the foreground window the next time the user generates input, unless the input is directed at that process, or the next time a process calls AllowSetForegroundWindow, unless that process is specified.

The foreground process can disable calls to SetForegroundWindow by calling the LockSetForegroundWindow function.

地址:https://msdn.microsoft.com/en-us/library/ms633539(v=VS.85).aspx

这个进程是前台进程。
这个进程是由前台进程的开始。
进程中收到的最后一个输入事件。
没有前台进程。
前台进程正在被调试。
前置不被锁定(见LockSetForegroundWindow)。
前置锁定超时已过期(看到SPI_GETFOREGROUNDLOCKTIMEOUTSystemParametersInfo)

需要满足上面一条即可,比如如果这个进程是后台进程,则不会起作用。可以在windows任务管理器中,查看是否在窗口最小化的时候,变成了后台进程。比如,常用的Hide方法,会是窗口变为后台进程,而窗口最下话操作,则不会改变进程状态,扔是前台进程。

 this.WindowState = FormWindowState.Minimized;

转载于:https://www.cnblogs.com/wolf-sun/p/7140493.html

[Winform]只允许运行一个exe,如果已运行则将窗口置前相关推荐

  1. 一个exe文件怎么运行起来的

    从OS层说起吧. OS都有加载程序的功能,一个可执行文件(比如exe,com等)内部都是机器指令(cpu相关的)和数据,所以可执行文件和OS以及编译器是密切相关的,不同的OS下不同的编译器产生的可执行 ...

  2. 无法运行rc.exe(已解决)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 原因 解决 一:在C:\Program Files (x86)下搜索rc.exe 二:右击,打开找到的rc.exe的文 ...

  3. ASP.NET查询页面设置form的action属性只弹出一个页面,并且每次将页面设置到最前...

    背景 当数据量大.查询条件复杂,多样多的时候,我们可能需要单独做一个查询界面,当用户选择设置了相关的查询条件后,点击[查询]按钮,系统就弹出一个新的页面展示出根据条件查询出的数据集. 然后,用户每点[ ...

  4. 将一坨WinForm文件包装成一个exe

    什么 .net core 3.1 新特性,ILMerge,Costura.Fody 都试了一遍,真心都不好使. 还是 WinRAR 最实在~ 第一步选中 Release 或它的子文件夹,就是最终包含你 ...

  5. 将keras训练好的神经网络模型生成独立于python环境运行的.exe文件并在matlab中调用(上篇)

    keras是深度学习简单易上手的python第三方库.在实际应用中,常常需要将keras训练好的深度学习模型生成独立于python环境的文件,供不会python的人或未安装python环境的设备调用. ...

  6. HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo

    26 集群使用初步 HDFS的设计思路 l 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l 在大数据系统中作用: 为各类分布式 ...

  7. HDFS设计思路,HDFS使用,查看集群状态,HDFS,HDFS上传文件,HDFS下载文件,yarn web管理界面信息查看,运行一个mapreduce程序,mapreduce的demo...

    26 集群使用初步 HDFS的设计思路 l 设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: l 在大数据系统中作用: 为各类分布式 ...

  8. C# WinForm只允许运行一个窗体实例

    大概看了看别人的方法,都是从语法的角度巧妙实现的. 我要实现的目的是dialogForm.Show(); 点击按钮显示对话框窗体,如果窗体没有关闭,再次点击,不重复显示. 我用了个笨方法,就是用一个静 ...

  9. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码

    2019独角兽企业重金招聘Python工程师标准>>> 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错.为了更便 ...

最新文章

  1. 84.柱形图中最大的矩形
  2. pybind11回调函数返回指针
  3. Java除法结果带小数、进一法的实现 Java问题通用解决代码
  4. java jsf_使用Java和JSF构建一个简单的CRUD应用
  5. 国内外软件开发上的差距与分析
  6. java for新循环_Java 8 新语法习惯 (for 循环的函数替代方案)
  7. dnn神经网络_【李宏毅机器学习笔记】深度神经网络(DNN)
  8. Twitter 有权删除去世用户的账号吗?
  9. Detailed Full-Body Reconstructions of Moving People from Monocular RGB-D Sequences
  10. mysql创建用户navicat_14MYSQL创建用户和授权、15Navicat的使用、16-pymysql模块的使用、17-索引...
  11. 最新服装零售软件管理排名
  12. wp8 android,WP8桌面主题|WP8桌面v1.5.2 for Android版 - 玩客网
  13. android即时通讯ui框架,android IM即时通信之聊天界面UI框架
  14. 眼睛怎么画?怎样才能画好人物的眼睛?
  15. 通过调试微信小程序示例代码解析flex布局参数功能(一)
  16. 是时候使用Markdown写作了
  17. 从成功到夺目: Google Play 2021 年度中国开发者最佳榜单
  18. UML笔记一:UML概述三(UML构成、UML中的事物)
  19. 快速修复IE浏览器方案
  20. G - RMQ and RAQ (cugb2023-s)

热门文章

  1. Server Core 的部署与管理
  2. Broker模块划分
  3. 洗礼灵魂,修炼python(42)--巩固篇—type内置函数与类的千丝万缕关系
  4. MySQL数据约束和关联查询
  5. MegCup 2017 极客挑战赛 初赛试题
  6. Java经典实例:处理单个字符串
  7. 企业级市场,正成为IT老兵创业的最佳选择
  8. 解决hibernate双向关系造成的一方重复执行SQl,或者死循环的问题
  9. [转载] 希腊字母读音表
  10. VMWARE VICLIENT实现虚拟机独立管理