zoukankan      html  css  js  c++  java
  • [.NET] 控制只启动单个指定外部程序

    独立观察员 2019 年 6 月 12 日

    有的时候我们程序需要启动外部程序来配合实现某些功能,比如启动一个 Cef 相关程序来承载网页。那么如果那个外部程序并没有实现单例启动,我们程序去启动它的时候就有可能启动了多个,这样轻则造成系统卡顿,重则引发 Bug。这肯定是我们不想看到的,所以本文来探讨如何在启动某个外部程序时,始终只会启动一个。

    先来看看外部程序(其实不用关心),其中有一个这样的类:

     1     public class BoundObject
     2     {
     3         [DllImport("user32.dll", EntryPoint = "ShowWindow", SetLastError = true)]
     4         static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);
     5  
     6         /// <summary>
     7         /// 是否关闭:1 - 隐藏  2 - 关闭
     8         /// 用法:onclick="javascript:alert ('1');BoundObject.CloseFlag ('1');"
     9         /// </summary>
    10         public void CloseFlag(string flag)
    11         {
    12             if (flag == "1")
    13             {
    14                 System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("CefApp");
    15                 if (processes.Length >= 1)
    16                 {
    17                     Console.WriteLine($"当前系统中有该程序在运行,将隐藏该程序");
    18                     //ShowWindow (processes [0].MainWindowHandle, 0);  // 隐藏;
    19                     ShowWindow(processes[0].MainWindowHandle, 6);    // 最小化;
    20                 }
    21             }
    22             else if (flag == "2")
    23             {
    24                 Console.WriteLine($"程序即将退出...");
    25                 Environment.Exit(0);
    26             }
    27         }
    28     }

    关键的就是 flag == “1” 里面的内容,先获取所有名为”CefApp” 的进程,如果大等 1,表示进程已经存在,这里是将其隐藏,用的是系统的 ShowWindow 方法。

    另外,与本文无关,但是有助于理解使用场景的是:该程序为一个 Cef 相关程序,以上的类可用于让 Cef 中承载的网页能够通过 JS 调用到这个 C# 的方法,进而进行隐藏或关闭控制。相关设置如下:

    1 CefSharp.Wpf.ChromiumWebBrowser webView = new CefSharp.Wpf.ChromiumWebBrowser();
    2  
    3 var bindScriptOption = new CefSharp.BindingOptions();
    4 bindScriptOption.CamelCaseJavascriptNames = false;
    5  
    6 webView.RegisterJsObject("BoundObject", new BoundObject(), bindScriptOption);

    回归正题,现在来看看主程序里面:

     1 System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("CefApp");
     2 if (processes.Length >= 1)
     3 {
     4     Console.WriteLine($"当前系统中已有该程序在运行,将唤起该程序");
     5     ShowWindow(processes[0].MainWindowHandle, 3); // 对隐藏程序不起作用;
     6 }
     7 else
     8 {
     9     string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "External", "Cef", "CefApp.exe");
    10     System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo(path);
    11     info.WorkingDirectory = Path.GetDirectoryName(path);
    12     System.Diagnostics.Process.Start(info);
    13  
    14     Thread.Sleep(1000 * 3);
    15 }

    也是获取所有”CefApp” 进程,如果有则启动之前最小化的该程序,没有则启动新程序。因为使用 ShowWindow 隐藏程序后无法再显示出来,所以只能配合最小化来使用,所以两个程序都是全屏运行效果会比较好。

    以上就是本文全部内容。

    http://dlgcy.com/dotnet-single-program/

  • 相关阅读:
    修改Firebug字体
    [CodeWars][JS]如何判断给定的数字是否整数
    [CodeWars][JS]实现链式加法
    【ACM成长之路】刷题记录
    【C++】用于ACM/OI等算法竞赛的读入优化
    C# 读取写入excel单元格(包括对excel的一些基本操作)
    Git上传本地项目到GitHub等云托管仓库
    贝塞尔曲线(B-spline)的原理与应用
    【已解决】Ubuntu U盘启动出现“Failed to load ldlinux.c32”问题
    【算法】Tarjan算法求强连通分量
  • 原文地址:https://www.cnblogs.com/weiliuhong/p/dotnet-single-program.html
Copyright © 2011-2022 走看看