[.NET] 控制只启动单个指定外部程序
有的时候我们程序需要启动外部程序来配合实现某些功能,比如启动一个 Cef 相关程序来承载网页。那么如果那个外部程序并没有实现单例启动,我们程序去启动它的时候就有可能启动了多个,这样轻则造成系统卡顿,重则引发 Bug。这肯定是我们不想看到的,所以本文来探讨如何在启动某个外部程序时,始终只会启动一个。
先来看看外部程序(其实不用关心),其中有一个这样的类:
public class BoundObject
{
[DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow); /// <summary>
/// 是否关闭:1 - 隐藏 2 - 关闭
/// 用法:onclick="javascript:alert ('1');BoundObject.CloseFlag ('1');"
/// </summary>
public void CloseFlag(string flag)
{
if (flag == "")
{
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("CefApp");
if (processes.Length >= )
{
Console.WriteLine($"当前系统中有该程序在运行,将隐藏该程序");
//ShowWindow (processes [0].MainWindowHandle, 0); // 隐藏;
ShowWindow(processes[].MainWindowHandle, ); // 最小化;
}
}
else if (flag == "")
{
Console.WriteLine($"程序即将退出...");
Environment.Exit();
}
}
}
关键的就是 flag == “1” 里面的内容,先获取所有名为”CefApp” 的进程,如果大等 1,表示进程已经存在,这里是将其隐藏,用的是系统的 ShowWindow 方法。
另外,与本文无关,但是有助于理解使用场景的是:该程序为一个 Cef 相关程序,以上的类可用于让 Cef 中承载的网页能够通过 JS 调用到这个 C# 的方法,进而进行隐藏或关闭控制。相关设置如下:
CefSharp.Wpf.ChromiumWebBrowser webView = new CefSharp.Wpf.ChromiumWebBrowser(); var bindScriptOption = new CefSharp.BindingOptions();
bindScriptOption.CamelCaseJavascriptNames = false; webView.RegisterJsObject("BoundObject", new BoundObject(), bindScriptOption);
回归正题,现在来看看主程序里面:
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("CefApp");
if (processes.Length >= )
{
Console.WriteLine($"当前系统中已有该程序在运行,将唤起该程序");
ShowWindow(processes[].MainWindowHandle, ); // 对隐藏程序不起作用;
}
else
{
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "External", "Cef", "CefApp.exe");
System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(path);
info.WorkingDirectory = Path.GetDirectoryName(path);
System.Diagnostics.Process.Start(info); Thread.Sleep( * );
}
也是获取所有”CefApp” 进程,如果有则启动之前最小化的该程序,没有则启动新程序。因为使用 ShowWindow 隐藏程序后无法再显示出来,所以只能配合最小化来使用,所以两个程序都是全屏运行效果会比较好。
以上就是本文全部内容。
http://dlgcy.com/dotnet-single-program/
[.NET] 控制只启动单个指定外部程序的更多相关文章
- WinForm程序,实现只启动一个实例
前言:在我们做的软件中,当点击图标运行时,正常的需求是只需要启动一个软件的实例,这是非常重要的一点,不然就显得我们的软件非常的山寨,笔者在工作中经常遇到同事没有注意这一点,看是不重要,实则非常的重要, ...
- 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面
[Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...
- 【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
大部分的引导界面基本上都是千篇一律的,只要熟练掌握了一个,基本上也就没什么好说的了,要想实现应用程序只启动一次引导界面这样的效果,只要使用SharedPreferences类,就会让程序变的非常简单, ...
- 如何让程序(如java Hello)只启动一次?
如何让程序(如java Hello)只启动一次? 摘自http://bbs.csdn.net/topics/50488704 总结一下,关于让Java程序只运行一个实例的问题,其实质是JVM之间通信的 ...
- MFC 只启动一个程序实例
问题描述: 我们开发过程中可能会经常遇到,只启动一个程序实例.即一个程序启动之后,如果再次执行该程序,将会恢复之前打开的程序,而不是打开一个新的程序. 实现原理:利用FindWindow/FindWi ...
- springboot打包去除资源文件,启动时指定配置文件位置,使用log4j2替换默认logback
springboot打包时,去掉资源文件 <build> <resources> <resource> <directory>src/main/reso ...
- 让vs只启动自己想调试的站点
VS中里面多个WEB项目如何只启动一个? 每次启动时,右下角都会出现一堆的 网站有10来个.即使设置了默认启动项目, 但每次按F5启动,或者哪怕是在项目上右键启动新实例 右下角都会出现这一堆的站点 有 ...
- img只显示图片一部分 或 css设置背景图片只显示图片指定区域
17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...
- WinFrom 只启动一个exe,并且获得焦点
只启动一个exe方法: using System; using System.Collections.Generic; using System.Runtime.InteropServices; us ...
随机推荐
- 计时 答题 demo
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- 用PHP写出计算器
<body> <?php if (!empty($_POST)) { $op=$_POST['point']; $sum1 = $_POST['sum1']; $sum2 = $_P ...
- python基础—条件语句
一.Python基础 1.第一句python print('hello,world') Q: 后缀名可以任意? A: 导入模块时,如果不是.py后缀,会出错. 2.两种执行的方式: -python解 ...
- 通过JS屏蔽鼠标右键
我也是第一次接触这个功能,只需一行代码即可搞定,直译过来就是“屏蔽上下文菜单”,特此记录一下吧. document.oncontextmenu = () => false;
- Thread之模板模式
我们知道,在实际使用线程的时候,真正的执行逻辑都是写在run方法里面,run方法是线程的执行单元,如果我们直接使用Thread类实现多线程,那么run方法本身就是一个空的实现,如下: /** * If ...
- QML::基本属性类型
QML基本属性类型
- 免sdk实现微信/支付宝转账打赏功能
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/162 近期发现了一个很好的开源项目,可以给自己的app添加 ...
- springboot整合spring Data JPA
今天敲代码,一连串的错误,我也是服气~果然,我们不是在出bug,就是在找bug的路上…… 今天完成的是springboot整合spring data JPA ,出了一连串的错,真是头大 java.sq ...
- 第十章 Centos7-系统进程管理
第十章 Centos7-系统进程管理 本节所讲内容: 10.1 进程概述和ps查看进程工具 10.2 uptime查看系统负载-top动态管理进程 10.3 前后台进程切换- nice进程优先 ...
- JAVA SE学习路径