• 解决使用C#打开第三方应用后进程关联问题


    问题描述 :

        打开开进程后调用第三方应用 , 关闭主应用时第三方应用也会关闭 

        (我这里要求第三方应用不能被关闭)

        代码如下:

            /// <summary>
            /// 打开文件选择框获取路径
            /// eg:
            /// Cef.OpenApplication("**.exe");
            /// </summary>
            /// <returns></returns>
            public void OpenApplication(string appName)
            {
    
                string dirpath = Application.StartupPath;
                if (!File.Exists(dirpath+"\"+appName))
                {
                    MessageBox.Show("启动失败,文件不存在");
                    return;
                }
                
                //System.Diagnostics.Process.Start(dirpath + "\" + appName);
                ShellExecute(IntPtr.Zero, new StringBuilder("Open"), 
                    new StringBuilder(appName), new StringBuilder(""), new StringBuilder(dirpath), 1);
            }
    
            /// <summary>
            /// 打开第三方应用
            /// 示例 :
            /// ShellExecute(IntPtr.Zero, new StringBuilder("Open"), new StringBuilder("test.exe"), new StringBuilder(""), new StringBuilder(@"C:文件夹名"), 1);
            /// </summary>
            /// <param name="hwnd"></param>
            /// <param name="lpszOp"></param>
            /// <param name="lpszFile"></param>
            /// <param name="lpszParams"></param>
            /// <param name="lpszDir"></param>
            /// <param name="FsShowCmd"></param>
            /// <returns></returns>
            [DllImport("shell32.dll")]
            public static extern int ShellExecute(IntPtr hwnd, StringBuilder lpszOp, StringBuilder lpszFile, StringBuilder lpszParams, StringBuilder lpszDir, int FsShowCmd);

    查看进程时发现进程被关联了

    解决方案 :

    使用资源管理器打开第三方应用 , 就像手动执行的结果一样

    代码如下 : 

    /// <summary>
            /// 打开文件选择框获取路径
            /// eg:
            /// Cef.OpenApplication("**.exe");
            /// </summary>
            /// <returns></returns>
            public void OpenApplication(string appName)
            {
    
                string dirpath = Application.StartupPath;
                if (!File.Exists(dirpath+"\"+appName))
                {
                    MessageBox.Show("启动失败,文件不存在");
                    return;
                }
    
                System.Diagnostics.Process.Start("Explorer.exe", dirpath + "\" + appName);
    //ShellExecute(IntPtr.Zero, new StringBuilder("Open"), // new StringBuilder("Explorer"), new StringBuilder(dirpath + "\" + appName), new StringBuilder(""), 1);//好使,会多打开多一个explorer.exe //System.Diagnostics.Process.Start(dirpath + "\" + appName); //ShellExecute(IntPtr.Zero, new StringBuilder("Open"), // new StringBuilder(appName), new StringBuilder(""), new StringBuilder(dirpath), 1); }

     打开程序时有可能会弹出杀毒软件阻止窗口 , 如下

    附 : 

    使用  Process.Start("Explorer.exe", dirpath + "\" + appName);打开应用后附进程不存在

     使用 

    ShellExecute(IntPtr.Zero, new StringBuilder("Open"),
    new StringBuilder("Explorer"), new StringBuilder(dirpath + "\" + appName), new StringBuilder(""), 1);

    打开应用后 , 任务管理器中会出现两个 explorer.exe 进程

  • 相关阅读:
    10-23C#基础--结构体
    10-23C#基础--特殊集合(stack、queue、hashtable)
    10-21C#基础--集合
    10-20C#基础---一维、二维数组&&冒泡排序
    10-19C#基础--第四部分类型(2)重点
    10-17C#第四部分--类型(1)
    10-17C#语句(3)--跳转语句、异常处理语句
    10-16C#for...循环语句(2)
    C# DEBUG 调试信息打印及输出详解
    .NET中值得体验的精妙设计
  • 原文地址:https://www.cnblogs.com/hi-gdl/p/12496882.html
Copyright © 2020-2023  润新知