Winform 一次只能打开一个应用程序,再次打开,不会打开新应用程序

C#中仅运行一个程序实例的方法 在日常工作中,大家经常会遇到想要让程序同时只能有一个实例在内存中运行的情况。比如某些比较耗费资源的工具,或者占用了某些特定端口的程序,启动多个实例没有意义。那么我们是怎么实现这种限制的呢? 在C#中,一般我们有两种办法,都非常简单。 使用Mutex 在C#中有两种Mutex,一种是Local的,仅在创建的进程中可见,主要作用就是实现进程内线程之间的同步。还有一种是有名字的,也叫Global M... 阅读详情
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Configuration;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Reflection;

namespace USBKEY
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            //0106add  一次打开一个应用程序
            Process instance = RunningInstance();
            if (instance != null)
            {
                if (instance.MainWindowHandle.ToInt32() == 0) //是否托盘化
                {
                    MessageBox.Show("程序已打开并托盘化");
                    return;
                }
                //1.2 已经有一个实例在运行
                HandleRunningInstance(instance);
                return;
            }

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }


       

        #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;
        }
        //3.已经有了就把它激活,并将其窗口放置最前端
        private static void HandleRunningInstance(Process instance)
        {
            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

       

    }
}

这是C# Program主程序代码,无法实现应用程序托盘化后再次点击,托盘栏程序自动还原的功能.

http://www.cnblogs.com/qingse/archive/2013/02/16/2913430.html 点击打开链接 该链接是某人的一个源代码,实现了用窗体自带最小化按钮,最小化后再次点击,可以重新还原打开程序,但经过测试无法在托盘栏实现该功能

C# WinForm 程序单实例运行,再次运行时激活前一个实例 一个简单的小程序,演示了winform程序如何运行单实例。当有实例运行时,再次单击,会激活第一个实例。 附主要源码: Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Threading; names 阅读详情

相关推荐

winform DMI应用程序,可打开、排列和关闭子窗口

winform DMI应用程序,可打开、排列和关闭子窗口 实现功能如下: ①可打开多个子窗口 ②关闭当前活动子窗口 ③关闭应用程序 ④排列已打开的子窗口 ⑤关闭所有子窗口 操作如下: ⑥创建窗体5-6-1、5-6-2,其中5-6-2作为被打开的子窗体,所需控件:MenuStrip,Name属性值如下: 5-6-1代码如下: //窗体的“Load”事件 private void _3_6_1_Load(object sender, EventArgs e) { //

前端小白的逆袭 1228

c#winform/wpf限制只能运行一个(互斥体)

在wpf中需要在app.xaml.cs里面写这段代码。

weixin_58760781的博客 857

用Visual C#开发WinForm的应用程序

举例如下:当我在自我介绍的时候(其实就是在定义我的属性),我会说"我的名字叫xx","我的年龄是xx","我的邮箱是xx"……StartPosition 这个属性有点类似于"Location"属性,"Location"属性定义的是WinForm的绝对位置,而本属性定义的是WinForm的相对属性。本属性的值定义为"CenterScreen"、"Manual"、"WindoowsDefaultLocation"、"WindowsDefaultBounds"、"CenterParent"

biyusr的专栏 979

C# 单例模式(一个窗体只能打开一次子窗体)

单例模式(一个窗体只能打开一次子窗体)

m0_47020592的博客 1286

C#实现限制只能启动一个WinForm进程的两种方法

的互斥体来确保只有一个进程可以获得对互斥体的所有权。如果当前进程能够成功获取互斥体的所有权,那么它就是第一个启动的进程,并且可以继续执行应用程序的逻辑。否则,如果无法获取互斥体的所有权,说明已经有一个进程在运行该应用程序,我们可以弹出一个消息框来提示用户。使用互斥体是一种简单直接的方法,而使用进程命名管道则更加灵活,可以进行更多的进程间通信操作。否则,如果连接超时,则说明没有其他进程在运行,我们可以继续执行应用程序的逻辑。进程命名管道是一种高级的进程间通信机制,可以用于实现进程之间的通信和同步。

XisVisual_Basic的博客 1088

Winform只允许打开一个实例

Winform窗体只允许打开一个实例。第二次打开报错。

C#(WinForm)实现软件只能启动一次,再次启动会将已启动的软件置顶显示

修改WinForm程序的Program.cs文件,实现程序只能被启动一次,如果当前软件正在运行时再次点击软件exe文件会将当前运行的软件中置顶显示。 代码如下: static class Program     {         ///           /// 该函数设置由不同线程产生的窗口的显示状态。          ///           /// 窗口句柄

heping860728的专栏 2279

X光安检模型训练第一步:手把手教你处理OPIXray和HIXray这两个小众数据集

本文详细解析了X光安检AI模型训练的关键步骤,重点介绍如何处理OPIXray和HIXray这两个专业数据集。从数据格式转换到YOLO标准,再到数据增强和质量验证,手把手指导开发者高效利用这些数据集进行目标检测模型训练,提升安检场景下的危险物品识别准确率。

weixin_32629853的博客 316

C#设置同一个winform程序一次只能运行一个

用C#开发winform桌面程序时,同一个exe程序,默认是可以启动多个实例的。但很多时候,我们只希望程序启动一个实例,可以通过以下代码进行设置: staticclassProgram { [DllImport("user32.dll",EntryPoint="SetForegroundWindow")] publicstaticexternintSetForegroundWindow(IntPtrhwnd); ...

ztnhnr的专栏 950

microduck复刻实战:强化学习机器人从仿真训练到真机部署全攻略

强化学习是智能体通过与环境交互试错来学习最优策略的机器学习范式,在机器人控制领域,常借助物理仿真环境进行策略训练,以降低真实世界的试错成本。其核心原理是通过奖励信号引导策略网络迭代优化,PPO等算法则在稳定性和样本效率之间取得平衡。仿真训练的价值在于可批量验证控制策略,但仿真与真实硬件之间存在物理参数偏差,需通过域随机化等技术实现迁移。从四足机器人到仿生机器人,这类方案广泛应用于复杂运动控制任务。microduck作为一个典型的强化学习机器人项目,其复刻过程涉及环境搭建、奖励设计、PPO调参及Sim-to-

weixin_29061425的博客 361

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

文章目录一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、遇到的问题 nvm 全名 node.js version management,顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 一、卸载node 如果你已经安装了node,那么你需要先卸载node,如果你没有安装那直接跳过这一步到下一步。 打开控制面板 -> 打开程序和功能 -> 右上角搜索输入node -> 右键卸载 为了确保彻底

HuangsTing的博客 41万+

c# 控制winform程序只能打开一个

这是完整的代码,你加在你的程序里面就可以了 using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Threading; using Sy

bjut_yue的专栏 1534

Labview调用C++ dll之字符串数组传递

做项目的时候碰到了一个需求,有一个复杂的运算,用labview实现非常的麻烦,但是如果用C++实现,就会灵活很多。尝试着采用Labview调用C++编写的动态链接库方式解决,兼顾Labview的便利和C++的灵活性。 运算好说,主要难点是Labview与C++之间的数据对应关系,因为我最后的结果是既有字符串又有数字,对于单纯的数字来说,直接通过调用数组的方式就能解决,这里主要记录一下字符串数组...

bgbgx的博客 6810

Winform 控制同一窗体只能打开一次的方法!

方法一:        ///         /// 控制只弹出一个子窗体        ///         /// 子窗体类型        public void FilmShow(Type type)        {            Form[] f = this.MdiChildren;            foreach (Form form in f)            {                if (form.GetType().Name == type.Name

圣卡西的球门 1137

最新测算源码PHP算命源码-风水八字-八字起名-塔罗牌占卜

未来,随着技术的发展和用户需求的变化,我们可以继续对系统进行升级和优化,以满足更多用户的需求和期望。数据库设计:创建一个名为bazi的数据库表,包含以下字段:id(自增ID)、name(姓名)、sex(性别)、birth_date(出生日期)、birth_time(出生时间)、bazi(八字结果)。数据库设计:创建一个包含塔罗牌信息的数据库表,如tarot_cards,包含字段:id(塔罗牌ID)、name(塔罗牌名称)、meaning(塔罗牌含义)等。根据操作系统的不同,PHP的安装方法会有所不同。

shanbeizi的博客 2420

【TC3xx芯片】TC3xx芯片STM介绍

TC3xx芯片STM介绍

qq_36056498的博客 2280

将PPT嵌入Winform:一个强大的C Winform应用程序

将PPT嵌入Winform:一个强大的C# Winform应用程序 【下载地址】CWinform打开PPT并嵌入到Winform中 C# Winform打开PPT并嵌入到Winform中本仓库提供了一个C# Winform应用程序的资源文件,该应用程序可以打开PPT文件并将其嵌入到Winform窗体中 ...

gitblog_09812的博客 1033

手把手教你用git上传项目到GitHub(图文并茂,这一篇就够了),相信你一定能成功!!

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好。 GitHub可以免费使用,并且快速稳定。即使是付费帐户,每个月不超过10美刀的费用也非常便宜。 利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一起完成这个项目。优点在于,他支持多人共同完成一个项目,因此你们可以在同一页面对话交流。 创建自己的项目,并备份,代码不需要保存在本地或者服务器,GitHub做得非常理想。 学习Git也有很多好处。他被视为一个预先维护过程,你可以按自己

左手の明天的博客 3万+

创建 WinForm 应用程序

创建 WinForm 应用程序 创建 WinForm 项目 点击【文件】>【新建】>【项目】选项,进入【新建项目】界面,选中【Windows窗体 应用程序】.并设置项目的名称、位置及解决方案名称。如下图所示。 2.创建空白窗体 选择图6-7项目区域中的【Windows窗体应用程序】后,点击【确定】按钮,创建一个空 白窗体,如下图所示 3.向窗体中添加控件 向图6-8所示的空白窗体中拖入一个Label文本标签与Button按钮,界面如下图所示。 4.设置控件的属性 在上图中,添加了 La

mmmjtt的博客 4837

【系统架构设计师】预测试卷十:综合知识(75道选择题)

本文包含75道选择题,覆盖计算机系统、操作系统、网络、数据库、软件工程等核心知识域,其中系统架构设计与评估占比最高(19题)。题目难度稍高,注重灵活应用,题干全新且不与前8套重复。部分典型题目解析包括:计算机性能比较(CPU时间公式TLB/页表机制)、Cache写策略、流水线分支惩罚、管程条件变量、LRU近似算法、自旋锁适用场景、TCP字节流特性、Anycast应用、MVCC机制、分布式事务选型等。答案详解强调易错点,如性能比较需综合计算、TLB缺失不等于缺页、

数据知道的博客 478

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

winform 子窗体只能打开一次该怎么做

你可以用这样 很简介的代码: Form f = Application.OpenForms["FormName"]; //查找是否打开过Form1窗体 if (f == null) //没打开过 { FormName fname = new FormName(); fname.Mdi

kuangshi2008的专栏 884

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WinForm窗体应用程序只能运行一个实例

说明:即程序不能进行多开,只能运行一个。

275

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WinForm 应用程序中开启新的进程及控制

在 Winform 里有时会需要打开另一个应用程序或文件,比如打开浏览器、打开word文档、打开文件夹和打印文件等等。本文介绍用 C# 在 Winform 中打开一个新进程,完成上述功能。 using System.Diagnostics 该命名空间提供与系统进程、事件日志、性能计数器的交互。其中与进程相关的两个基本类是 System.Diagnostics.Process 和 System.

码农 1277

winform 应用程序 只启动一次

winform 应用程序只启动一次 思路:捕获系统进程,是否和当前进程有一致的 引用程序集:using System.Diagnostics; static class Program { /// &lt;summary&gt; /// 应用程序的主入口点。 /// &lt;/summary&gt; ...

Luffy's blogs 1223

单例模式(Winform窗体的实现,解决再次打开报错 内存已经释放问题)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入   在我的设...

qq_37142766的博客 1649

winform应用程序初识——常见组件学习

winform相关概念以及组件学习

HYHDYK的博客 2881
上一篇: C# 判断字符串是否为2进制,8进制,10进制,16进制
下一篇: C# 通过类或者数据表名获取主键字段(没有外键)
浅笑_微梦
博客等级 码龄9年 106粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值