独立观察员 2019 年 6 月 12 日

有的时候我们程序需要启动外部程序来配合实现某些功能,比如启动一个 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/

最新文章

  1. kali安装后的网络设置
  2. C#执行OracleHelper
  3. 我在 impress.js 中学到的小套路
  4. 行转列:SQL SERVER PIVOT与用法解释
  5. 关联参数(&amp;的用法)
  6. php openssl 生成公私钥,根据网上文章整理的
  7. android xml文件
  8. SPRING IN ACTION 第4版笔记-第五章BUILDING SPRING WEB APPLICATIONS-006-处理表单数据(注册、显示用户资料)
  9. 使用 Struts 2 实现国际化
  10. swift-数组array
  11. HDU--杭电--4506--小明系列故事——师兄帮帮忙--快速幂取模
  12. Import Statements 导入语句
  13. java从命令行接收多个数字,求和程序分析
  14. Blender软件基本介绍(3D建模软件)
  15. Python学习笔记-基础2
  16. Struts与jsp+javabean+servlet区别
  17. 写前端页面步骤----vue+iview
  18. onsubmit ajax return false 无效
  19. FastJson 对enum的 序列化(ordinal)和反序列化
  20. ls 列出文件目录(可以含子目录)及文件的完整路径

热门文章

  1. JavaWeb之(1)Tomcat安装及项目的发布方法
  2. Asp.net MVC 中的TempData对象的剖析
  3. CSS3 新增选择器
  4. [转]关于maven pom.xml中dependency type 为pom的应用
  5. MySQL 部署分布式架构 MyCAT (五)
  6. 8. 多态——编译时类型&amp;运行时类型
  7. selenium python 脚本不支持中文问题
  8. 自动化部署-svn hook触发构建
  9. java面试遇到的坑[第三期]
  10. 数据分析三剑客 numpy,oandas,matplotlib(2)