公司的系统搭载了好多奇奇怪怪的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. 一位ACMer过来人的心得

    http://blog.csdn.net/acm_cxlove/article/details/8079348

  2. [bzoj1617][Usaco2008 Mar]River Crossing渡河问题_动态规划

    River Crossing渡河问题 bzoj-1617 Usaco-2008 Mar 题目大意:题目链接. 注释:略. 想法:zcs0724出考试题的时候并没有发现这题我做过... 先把m求前缀和, ...

  3. Ubuntu 16.04安装indicator-sysmonitor实现导航条显示上下行网速/CPU/内存使用率

    安装: sudo add-apt-repository ppa:fossfreedom/indicator-sysmonitor sudo apt-get update sudo apt-get in ...

  4. 【UI自动化方面】

    1.自动化执行失败如何排查故障. 答:1).查看log,错误原因.[log不详细的话,可以优化] 2).排查是否真的有bug,若不是bug查看是否是新版本引入了新的变更. 3).调试脚本看自己脚本是不 ...

  5. 将jsp页面的<s:iterator>的数据返回到action

    jsp: <form method="post" id="createTable"> <table width="98%" ...

  6. jquery操作删除元素

    通过 jQuery,可以很容易地删除已有的 HTML 元素. 删除元素/内容 如需删除元素和内容,一般可使用以下两个 jQuery 方法: remove() - 删除被选元素(及其子元素) empty ...

  7. linux 设备树及节点引用【转】

    本文转载自:http://blog.csdn.net/KjfureOne/article/details/51972854 1.ARM Linux社区为什么要引入设备树 Linux之父Linus To ...

  8. Mysql的简单使用(一)

    如果你会查询这些相关的问题,说明你是一个正在或者准备从事IT的程序猿,对于一个程序猿而言,不会使用linux系统的程序猿不是一好的程序猿哦!因为windows有时候真的让人很抓狂,而本人也相信没有什么 ...

  9. [BZOJ 3126] Photo

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=3126 [算法] 差分约束系统 注意SPFA判负环的条件应为 : 若所有点入队次数之和 ...

  10. PCB NOSQL MongoDb MI流程指示数据存储结构

    一.MI流程指示结构 二.产品型号树结构(即盲埋孔板型号结构) 三.MI流程指示UI 小结:1.MI流程指示使用的表非常之多(30多张表),存储的数据分散到各个表中,而NOSQL 一个产品型号一条记录 ...