公司的系统搭载了好多奇奇怪怪的exe,以前启动exe后,系统还能接着操作。但是后面又提出额外的需求,说是打开外部exe之后,启动exe的父界面要完全不能进行任何操作。当然按常人所想再加一句waitforexit就能决了啦,然后公司的测试超级牛逼,在exe启动的时候跑去父界面随便点了一个按钮,然后奇怪的事情就发生了:在exe关闭之后,你刚刚点击的那个按钮就会里面响应。其实最后发现不止是按钮,是整个界面都会在exe启动的过程中响应鼠标事件,但是需求要和showdialog出子界面一样的效果。虽然用户一般在exe启动的时候,也不会去乱点什么就是了,但是bug就是bug,不能不解决啊。期间想过很多办法,比如重写WndProc,比如设置flag,比如启动exe重新开线程,但是都不能很好的解决。最后受人指点如此解决了。

private void btnInvoke_Click(object sender, EventArgs e)
{
       MessageBox.Show("Hello ");
}

private void btnTest_Click(object sender, EventArgs e)
{
        this.Enabled = false;
        Thread t = new Thread(new ThreadStart(delegate
        {
             System.Diagnostics.Process exep = new System.Diagnostics.Process();
             exep.StartInfo.FileName = @"C:\Test1.exe";
             exep.EnableRaisingEvents = true;
             exep.Start();
             exep.WaitForExit();
             this.BeginInvoke(new Action(() => { this.Enabled = true; }));
        }));
        t.Start();
}

为什么会出现这种情况呢?首先启动exe的waitforexit只是将主线程(UI线程)挂起了,或者说暂时阻塞它,在exe保持启动的过程中,你对父界面进行的任何操作其实都会像排队一样被排它主线程中去,等主线程被阻塞的事情结束之后,它就会开始反应了。而且这种现象只会响应你对父界面的第一次操作,就是点一个button,在去点关闭按钮,只会响应button事件,相反,就会响应关闭事件。现在的做法是把启动exe的事情放到新的线程里面去做,不去阻塞主线程,再非活性化界面,最后用begininvoke异步执行指定的委托,在活性化界面,这样就能完全阻止那种现象的发生。不过就算如此写,waitforexit也是不能省的,之前查waitforexit是相当于挂起主线程,但是在这里把waitforexit省掉,非活性化整个界面的代码就没有用了,非活性化后面begininvoke在活性化,两部一起,等于没有做,另外省掉的话父界面就直接能操作了,所以看来waitforexit还是要搭配一起写才能实现最终效果。

C# winform启动外部exe后,如何完全阻断父界面接收事件,扩展waitforexit的更多相关文章

  1. delphi窗体启动外部exe

    uses Winapi.Windows; WinExec(PAnsiChar(Application.ExeName), sw_normal);   // PAnsiChar : string to ...

  2. 在程序中通过Process启动外部exe的方法及注意事项

    启动外部进程的方法: /// <summary> /// 启动外部进程 /// </summary> /// <param name="path"&g ...

  3. 启动外部exe程序

    Process myProcess = new Process();myProcess.StartInfo.FileName = pathName;myProcess.Start();其中的pathN ...

  4. 启动LINUX系统后,进入图形化界面的命令

    1.进入xWindow的命令 $startx回车 或者修改/etc/inittab文件 cd /etc vi inittab 寻找: id:3:initdefault: 改为: id:5:initde ...

  5. 外部exe窗体嵌入winform

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...

  6. 【UE4 C++】 启动 / 关闭外部exe、开启虚拟键盘

    启动/关闭外部exe 引擎自带 FPlatformProcess::CreateProc() FPlatformProcess::TerminateProc() windows api ShellEx ...

  7. windows下调用外部exe程序 SHELLEXECUTEINFO

    本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: type ...

  8. sqlserver数据库触发器调用外部exe

    sqlserver数据库触发器调用外部exe,同事可以选择参入参数! sqlserver使用 master..xp_cmdshell 进行外部exe的执行. 使用master..xp_cmdshell ...

  9. C#和asp.net执行外部EXE程序

    这两天研究下.Net的执行外部EXE程序问题,就是在一个程序里通过按钮或其他操作运行起来另外一个程序,需要传入参数,如用户名.密码之类(实际上很类似单点登录,不过要简单的多的多):总结如下: 1.CS ...

随机推荐

  1. [COGS311] Redundant Paths

    ★★☆   输入文件:rpaths.in   输出文件:rpaths.out   简单对比 时间限制:1 s   内存限制:128 MB Description In order to get fro ...

  2. Docker website

    https://github.com/docker/labs/  (nguo123gmail  Cooooos123!) Docker Tutorials and Labs At this time ...

  3. 洛谷—— P2196 挖地雷

    https://www.luogu.org/problem/show?pid=2196 题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定 ...

  4. PageUtil ,简单的分页工具

    public class PageUtil { private int totalCount;//总数 private int pageSize=10;//每页显示数量 private int cur ...

  5. SiteMesh基础教程

    SiteMesh是由一个基于Web页面布局.装饰以及与现存Web应用整合的框架.它能帮助我们在由大量页面构成的项目中创建一致的页面布局和外观,如一致的导航条,一致的banner,一致的版权,等等. 教 ...

  6. What are Unix swap (.swp) files?

    原文: http://www.networkworld.com/article/2931534/it-management/what-are-unix-swap-swp-files.html ---- ...

  7. nginx-tomcat负载均衡redis-session共享,静态资源分离

    nginx-tomcat负载均衡redis-session共享.静态资源分离 基本环境: redis-2.8 apache-tomcat-6.0.41 nginx1.6.2 1.redis配置 1,配 ...

  8. LeetCode 409. Longest Palindrome (最长回文)

    Given a string which consists of lowercase or uppercase letters, find the length of the longest pali ...

  9. LeetCode 83. Remove Duplicates from Sorted List (从有序链表中去除重复项)

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  10. Android中相机拍照

    Android中调用系统相机的api接口在android.hardware包中.包里面类主要用到了Camera类.该类里面包含几个内部类:Camera.Parameters.Camera.Camera ...