C#禁止应用程序同时运行的方法

开源数显表 开源数显表,广泛应用于车床、铣床、磨床、镗床、火花机、线切割等。市面上此类液晶数显表多数都是基于此项目。 一、基本配置 硬件 主控:STM32F407VGT6 LCD:群创AT070TN92 显示驱动:RA8875 光栅尺:3 x 输入(X/Y/Z) 串口:1 x MAX3232 继电器:2 x 输出 存储:AT24C64 模拟输入:LM324C 电源:AC 220V 软件 工程版本:Keil 5 STM32库:V1.4.0 图形界面:uCGUI 多语言支持:中文、英文 二、项目文 阅读详情

using System;

using System.Collections.Generic;

using System.Windows.Forms;

 

namespace SingleProcessStart

{

    static class Program

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        //

        //使用STAThread属性将程序的默认线程模型指定为单线程模型。

        //注意,线程模型只影响使用COM interop的应用程序,将这个属性应用于不使用COM interop的程序将不会产生任何效果。

        [STAThread]

        //[MTAThreadAttribute]

        static void Main()

        {

            ////原始

            //Application.EnableVisualStyles();

            //Application.SetCompatibleTextRenderingDefault(false);

            //Application.Run(new Form1());

 

            //方法一,使用线程互斥

            //bool createdNew = false;

            //System.Threading.Mutex mutex = new System.Threading.Mutex(true, "OnlyOnceTime", out createdNew);

            //if (createdNew)

            //{

            //    Application.EnableVisualStyles();

            //    Application.SetCompatibleTextRenderingDefault(false);

            //    Application.Run(new Form1());

            //}

            //else

            //{

            //    MessageBox.Show("程序已经运行!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

            //}

 

            //方法二,使用API实现

            /*

             * 关于方法二的调试,需要注意的是要将项目--属性--调试,选择启用外部程序,选择到你的EXE文件,然后先开启你的EXE文件

             * 否则在调试时.NET默认会使用vshost.exe的宿主进程(宿主进程随.NET启动而启动),而此宿主进程在外部无法启用,因此永远是唯一的

             */

            System.Diagnostics.Process p = GetRunningInstance();

            if (p != null) //已经有应用程序副本执行

            {

                HandleRunningInstance(p);

            }

            else //启动第一个应用程序

            {

                Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new Form1());

            }

        }

 

        //以下为方法二调用API代码

        private const int WS_HIDE = 0;//窗口隐藏

        private const int WS_SHOWNORMAL = 1;//窗口处于正常状态

        private const int WS_SHOWMIN = 2;//窗口处于最小化状态

        private const int WS_SHOWMAX = 3;//窗口处于最大化状态

 

        /// <summary>

        /// 显示窗口

        /// </summary>

        /// <param name="hWnd">句柄</param>

        /// <param name="cmdShow">显示模式</param>

        /// <returns></returns>

        [System.Runtime.InteropServices.DllImport("User32.dll")]

        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

 

        [System.Runtime.InteropServices.DllImport("User32.dll")]

        private static extern bool SetForegroundWindow(IntPtr hWnd);

 

        /// <summary>

        /// 查找窗口的句柄

        /// </summary>

        /// <param name="className">指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类</param>

        /// <param name="titleName">指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题</param>

        /// <returns>句柄</returns>

        [System.Runtime.InteropServices.DllImport("User32.dll", EntryPoint = "FindWindow")]

        public static extern int FindWindow(string className, string titleName);

 

        /// <summary>

        /// 获取应用程序进程实例,如果没有匹配进程,返回Null

        /// </summary>

        /// <returns>返回当前Process实例</returns>

        public static System.Diagnostics.Process GetRunningInstance()

        {

            //获取当前进程

            System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();

 

            //获取当前运行程序完全限定名

            string currentFileName = currentProcess.MainModule.FileName;

 

            //获取进程名为ProcessNameProcess数组。

            System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName(currentProcess.ProcessName);

          

            //遍历有相同进程名称正在运行的进程

            foreach (System.Diagnostics.Process process in processes)

            {

                if (process.MainModule.FileName == currentFileName)

                {

                    if (process.Id != currentProcess.Id)//根据进程ID排除当前进程

                        return process;//返回已运行的进程实例

                }

            }

            return null;

        }

 

        /// <summary>

        /// 获取应用程序句柄,设置应用程序前台运行,并返回bool

        /// </summary>

        public static bool HandleRunningInstance(System.Diagnostics.Process instance)

        {

            IntPtr intPtr = new IntPtr(instance.MainWindowHandle.ToInt32() == 0 ?

                FindWindow(null, "Form1") : instance.MainWindowHandle.ToInt32());

           

            //使窗口最大化

            ShowWindowAsync(intPtr, WS_SHOWMAX);

           

            //设置前台进程为已运行的进程,而现有进程继续执行至进程结束(在这里跑完MAIN函数就结束掉了)

            return SetForegroundWindow(instance.MainWindowHandle);

        }

 

        /// <summary>

        /// 获取窗口句柄,设置应用程序前台运行,并返回bool值,重载方法

        /// </summary>

        /// <returns></returns>

        public static bool HandleRunningInstance()

        {

            System.Diagnostics.Process p = GetRunningInstance();

            if (p != null)

            {

                HandleRunningInstance(p);

                return true;

            }

            return false;

        }

    }

}

【原创教程】AB上位机FactoryTalk View的使用教程 条形图主要的作用就是根据绑定的变量中数字大小的变化来反映到图形中,随着数字的增加填充的颜色不断上升或随着数字的减小填充的颜色不断下降。绘图功能中常用的功能主要是:数字输入,数字输出,字符输入,字符输出,各种类型的的按钮,条状图,各类控件,系统自带的图形库。颜色指的是根据PLC变量的变化来改变图形的颜色,可以绑定BOOL量来显示两种颜色,也可以绑定字节,字,双字等来显示多种颜色。打开软件后右键点击画面选项然后点击新建则新建出一个画面,画面画好后点击保存并更改标题后新建的画面则会出现在画面选项的文件夹下。 阅读详情

相关推荐

掌握禁止程序运行的两种主要技术方法

在当今的网络安全领域,控制程序运行是确保系统安全的一个重要环节。禁止特定程序运行,无论是出于保护系统安全还是提高工作效率,都是一种常见的实践。本章将为读者概述禁止程序运行的基本原理与方法。首先,了解基本原理是重要的。通常,操作系统通过一系列的策略来控制程序的启动和运行。这些策略包括操作系统级的限制、系统文件和注册表的配置,以及特定的安全软件和策略。接着,我们将探讨在不同操作系统环境下,如何实现禁止程序运行的目标。

weixin_42451850的博客 406

C#注释的一些使用方法浅谈

C# Coding的时候,常常涉及代码注释,常见的注释包括两类:1)单行注释。格式:// Comments2)多行注释。格式:/* Comments… */C#引入了新的XML注释,即我们在某个函数前新起一行,输入///,VS.Net会自动增加XML格式的注释,这里整理一下可用的XML注释。XML注释分为一级注释(Primary Tags)和二级注释(Secondary Tags),前者可以单独存在,后者必须包含在一级注释内部。I 一级注释1. <remarks>对类型进行描述,功能类似<summary>,据说建议使用<remarks>;2. <summary>对共有类型的类、方法、属性或字段

禁止程序运行c#源代码)

两种方式来禁止程序的运行,也可以永久禁止,来防止其他人在你的电脑里运行你不愿意他们运行的程序。还有很多用途等你们发现哦~

Simple Run Blocker:程序运行拦截器 阻止程序运行

Simple Run Blocker可以直接拦截程序运行,阻止程序运行,是一个绿色免费软件,非常值得收藏

clinch的专栏 1475

C#简单的消除注释

using System; using System.IO; using System.Text ; using System.Collections.Generic ; using System.Threading.Tasks; using System.Linq; namespace shanchuzhushi { class MainClass { //边读边...

weixin_30731305的博客 639

C#忽略XML文件注释

直接上代码: XmlDocument xmlDoc = new XmlDocument(); XmlReaderSettings settings = new XmlReaderSettings(); settings.IgnoreComments = true; //忽略注释 XmlReader reader = XmlReader.Create(filePath,...

weixin_30332705的博客 202

C# 禁止windows程序重复运行的两种基本方法

一般的如果运行一个软件、让他处于运行状态,然后我们再去打开这个程序时就会提示我们 “程序已启动或者不能重复启动此程序”,比如QQ对战平台 ,就限制一台机子启动两个QQ对 战平台,那么他在C#中是如何实现的呢? 一般有两种方法,我是用的是第一种 方法1: 在项目的第一个窗体的启动事件中 如form1_load() 中添加如下语句 ===========================

gooodiuck的专栏 603

c# winform禁止同时开启多个程序

原文:https://blog.csdn.net/huanshanv20008/article/details/6369839 在Program.cs中加入代码 static class Program { /// /// 应用程序的主入口点。 /// [STAThread] static v...

qq_40138785的博客 866

C# 将ComboBox设置为禁止编辑的方法

C# 将ComboBox设置为禁止编辑的方法 原创镇上村树 发布于2018-05-08 15:10:48 阅读数 13424 收藏 展开 2018年5月8日14:53:21 将ComboBox的DropDownStyle 属性设置为 DropDownList即可. Simple 简单的下拉列表框(始终显示列表)、 DropDown 可以编辑,与有下拉列表。默认. DropDownList 只有...

cxu123321的博客 6066

C#禁止应用程序的多重运行

//参考别人的代码得来的//官方参考资料http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconmutex.asp//引入命名空间using System.Text;using System.Threading;///   /// 应用程序的主入口点。  ///   [ST

xqf222的专栏 1439

C# Winform 禁止重复运行

1publicBgControlForm(string[]args)2{3InitializeComponent();4MessageBox.Show(args[0]);56System.Threading.Mutexmutex=...

ahb0293的博客 126

C# 禁止程序运行多次

本文讲述:在WPF中,禁止程序运行多次有很多种方法,这里使用互斥量来实现。 通过获取程序集元数据,判断软件是否运行,使用互斥量,防止程序多个同时运行。 System.Threading.Mutex m_mutex; protected override void OnStartup(StartupEventArgs e) { Assembly assembly = Assembly.Ge...

^@^lemon tea^@^ 581

dotnet不是内部或外部命令_dotnet 多线程禁止同时调用相同的方法 禁止方法重入调用 双检锁的设计

大家在使用多线程的时候,是否有关注过线程安全的问题。如果咱的代码在使用多线程时,在相同的时间有多个线程同时执行相同的方法,此时也许就存在数据安全的问题,如多个线程之间对相同的内存进行同时的读取和修改。而让方法在多线程调用中,相同的时间会被多个线程同时执行某段代码逻辑的技术称为方法重入调用技术,而禁止方法同时调用也就是禁止方法重入调用。在 dotnet 里面有多个方式可以做到禁止方法重入调用,本文...

weixin_39612038的博客 246

C#(Winform)限制应用程序只能运行一个

方法一:只禁止多个进程运行 using System; using System.Collections.Generic; using System.Windows.Forms; namespace DuoYeMianIE { static class Program { /// <summary> /// 应用程序的主入口点。 ...

Diamond、的博客 3116

C# 禁止程序重复启动

C# 禁止程序重复启动

m0_37570176的博客 1348

c#禁止同时打开两个相同的程序

有时候运行可通信软件时,如果打开两个软件,通信有可能会造成混乱,为了避免这样的情况,我们可以在启动软件前先检测是否打开了软件,若打开,则弹出提示并关闭。 代码块: Process[] pro = Process.GetProcessesByName("CarParkInspectApp"); if (pro == null || pro.Length >= 2) { MessageBox.Show("软件已打开,请勿重复

Yyuanyuxin的博客 1288

Multisim14.0安装包

Multisim14.0安装包

上一篇: C#资源文件
下一篇: C#迭代器(Foreach)实现方法
bjddd192
博客等级 码龄19年 7粉丝 10原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值