原文 C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0

前几天遇到了一个在C#的winform程序中,启动一个第三方jar程序,并修改jar运行窗体的标题的问题。
大体的需求就是上面说明的那样,下面是当初设想的思路和实现代码。
STEP1
// 根据jar文件的路径,启动该jar
Process p = Process.Start(jarfilePath);
 
STEP2
// 引用WindowsAPI中SetWindowText的声明
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetWindowText")]
public static extern int SetWindowText(IntPtr hwnd, String lpString);
 
STEP3
// 得到启动的jar窗体的句柄
IntPtr hwnd = p.MainWindowHandle;
 
STEP4
// 改变jar窗体的标题栏文字
SetWindowText(hwnd, "标题栏新文字");
 
通过上面这四个步骤,感觉应该就可以改变启动的外部第三方程序的窗口标题栏了。
但,实际运行结果却不是想象的那样。追究为什么启动的外部第三方应用程序窗体的标题栏文字为什么没有改变,是哪行代码没被执行到,或是哪行代码出错了,在DEBUG单步执行时,却又没发现任何问题,新窗体的句柄也正常,执行完上面第四步骤的那行代码之后,看新窗体的标题栏文字,完美地被改变了。
百思不得其解,接下来的思路就是看不DEBUG单步执行时,哪行出了问题,于是在关键步骤3的后面,添加了下面的调试输出代码
Console.WriteLine("handle>>>" + hwnd);
这时的执行结果果然暴漏了问题所在,调试语句输出的MainWindowHandle为0.
 
接下来问题的关键就是找到为什么Process.MainWindowHandle得到的窗体句柄是0的问题的原因
几经google之后,发现了问题的原因,国外专家给出的原因解释,感觉还挺靠谱的。
 
The value is also zero for processes that have been hidden, that is, processes that are not visible in the taskbar. This can be the case for processes that appear as icons in the notification area, at the far right of the taskbar.
 
大体意思就是通过Process.Start得到的process还没在任务栏上创建出icon来,所以这个process貌似就被认为是不可见的,所以得到的句柄就是0.
看到这里就很容易理解为什么在DEBUG单步调试时,Process.MainWindowHandle是正常的原因了
基于上面这些解释,找到了在STEP3之前增加一下代码的解决方案。
while (p.MainWindowHandle == IntPtr.Zero)
                {
                    System.Threading.Thread.Sleep(100);
                }
 
到此,问题解决。但仍残留了一个值得思考的问题。在Process类下有WaitForInputIdle()这个方法,看msdn上的解释貌似也是等待,我尝试着不用上面那个while循环,而用p.WaitForInputIdle();来代替,结果是不行的。
为什么呢,希望有对此熟悉的朋友能给个解释。

C#中通过Process启动的外部第三方程序MainWindowHandle句柄为0的更多相关文章

  1. python 怎么启动一个外部命令程序, 并且不阻塞当前进程

    http://www.myexception.cn/perl-python/1278887.html http://blog.chinaunix.net/uid-25979788-id-3081912 ...

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

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

  3. 在C#中使用 SendMessage 实现操作外部其他程序上的控件教程

    一.C#代码实现 本案例使用的是c# winform .NET Framework 4.7.2 首先我们声明一个寻找窗体的函数 [DllImport("User32.dll", E ...

  4. 关于用python作为第三方程序,来调用shell命令的问题,以及返回值格式解析

    1.用python语言作为第三方,调用shell 在python2.x中,可以通过包commands来进行调用shell命令.如下: cmd就是你要调用的shell命令,把环境配置好,输入正确的命令格 ...

  5. C#中启动外部应用程序

    C#中我们可以通过Process类直接启动外部应用程序 代码如下: Process p = new Process();                    p.StartInfo.FileName ...

  6. [C#]做服务使用Process启动外部程序没窗体

    这几天会到一个需要,要时时侦测文件生成,并上传到Server上,侦测文件生成使用的FileSystemWatch.但是时时运行遇到了问题,程序可能会人为退出或者意外终止,使用一个进程监控程序的监程,也 ...

  7. Android如何做到应用程序图标隐藏,由第三方程序启动

    在你App的AndroidManifest.xml中,将启动页做如下修改 <intent-filter> <action android:name="android.int ...

  8. 在Visual Studio中快速启动调试Web应用程序

    原文:http://blog.csdn.net/effun/article/details/2638535 到2005,Visual Studio在启动调试的功能上进行了一些改善,不过因为只是简单的一 ...

  9. 在 C# 中使用文件名启动应用程序

     本文演示了如何启动与某一给定文档扩展名或文件类型关联的应用程序而又无须知道该关联应用程序的名称或位置.例如,您可以用一个与 .bmp 文件扩展名关联的应用程序启动 Arcade.bmp 文件,多 ...

随机推荐

  1. 学php之翻译wordpress(2)

    wp-load.php <?php /** * Bootstrap file for setting the ABSPATH constant * and loading the wp-conf ...

  2. Oracle之PLSQL总结

    基本数据类型变量 1. 基本数据类型     Number 数字型     Int 整数型     Pls_integer 整数型,产生溢出时出现错误 Binary_integer 整数型,表示带符号 ...

  3. CLR读书笔记——委托

    协变性和逆变性 协变性是指方法能返回从委托返回类型派生的一个类型. 逆变性是指获取的参数可以是委托参数类型的基类. 举个例子吧,看以下定义的委托,以及方法. delegate Object MyCal ...

  4. CKEditor扩展插件:自动排版功能

    CKEditor是新一代的FCKeditor,是一个重新开发的版本.CKEditor是全球最优秀的网页在线文字编辑器之一,因其惊人的性能与可扩展性而广泛的被运用于各大网站. 如果还没接触过的可以看看, ...

  5. Java GC 日志详解(转)

    Java GC日志可以通过 +PrintGCDetails开启 以ParallelGC为例 YoungGC日志解释如下(图片源地址:这里) : FullGC(图片源地址:这里): http://blo ...

  6. Boost 1.61.0 Library Documentation

    http://www.boost.org/doc/libs/1_61_0/ Boost 1.61.0 Library Documentation Accumulators Framework for ...

  7. Ubuntu下Eclipse搭建ARM开发环境

    第一步:安装JRE 和 Eclipse 详细步骤请参考:http://blog.csdn.net/ex_net/article/details/7251664 第二步:安装arm-linux-gcc ...

  8. Asp.Net MVC3 简单入门第一季(三)详解Controller之Filter

    前言 前面两篇写的比较简单,刚开始写这个系列的时候我面向的对象是刚开始接触Asp.Net MVC的朋友,所以写的尽量简单.所以写的没多少技术含量.把这些技术总结出来,然后一简单的方式让更多的人很好的接 ...

  9. Node.js 参考学习地址

    前段时间研究过Node.js 自从由于笔记本硬盘崩了之后就很少在家里搞程序了,但是很想学习之,只因最近在努力学习英文.技术之外的事也需要做好,我们毕竟不是为了技术而生,技术是我们生存的一门得力技能,唯 ...

  10. PIE(二分) 分类: 二分查找 2015-06-07 15:46 9人阅读 评论(0) 收藏

    Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissio ...