公司的系统搭载了好多奇奇怪怪的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. 高数(A)下 第十章

    10.1 10.2 10.3 10.4 10.5 10.7 自测题

  2. vijos 1237 隐形的翅膀

    隐形的翅膀 背景 小杉终于进入了天堂.他看到每个人都带着一双隐形翅膀,他也想要. (小杉是怎么看到的?……) 描述 天使告诉小杉,每只翅膀都有长度,两只翅膀的长度之比越接近黄金分割比例,就越完美. 现 ...

  3. 在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出MethodArgumentNotValidException异常,因此,只需要在ExceptionHandler类中添加处理对应异常的方法即可。

    在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出Method ...

  4. 不折移动web不腾--开启我的个人Mac之旅

    背景,非常久非常久曾经(听过)Linux,瞎玩 Mac mini,而今Linux下开发技能半身不遂,处于放任状态.明明就知道随着时间流逝会越陌生的东西越不想去抓住最后的余温,不知道这算不算放弃,反正迟 ...

  5. 微軟将弃用 System.Data.OracleClient

    http://www.cnblogs.com/WizardWu/archive/2010/05/17/1737009.html 微軟将从 .NET 4 以后的版本弃用 System.Data.Orac ...

  6. javascript 事件对象(event 对象)

    原文: http://www.cnblogs.com/songyaqi/p/5204143.html <html> <head> <title> Track Mou ...

  7. Linux网络编程:UDP实现可靠的文件传输

    我们知道,用TCP实现文件传输很简单.相对于TCP,因为UDP是面向无连接.不可靠的传输协议,所以我们需要考虑丢包和后发先至(包的顺序)的问题,所以我们想要实现UDP传输文件,则需要解决这两个问题.方 ...

  8. 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展

    将一个对象相同的属性(不区分大小写)赋值给一个新对象   1 public static T Mapper<S, T>(S source) 2 { 3 T t = Activator.Cr ...

  9. hdoj 4925 Apple tree 【最小割】

    题目:pid=4925">hdoj 4925 Apple tree 来源:2014 Multi-University Training Contest 6 题意:给出一个矩阵,然后每一 ...

  10. luogu1641 [SDOI2010]生成字符串

    题目大意 把$n$个$1$和$m$个$0$组成字符串,在任意的前$k$个字符中,$1$的个数不能少于$0$的个数.求这样的字符串的个数.$1\leq m\leq n\leq 1000000$. 原始模 ...