原文 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();来代替,结果是不行的。
为什么呢,希望有对此熟悉的朋友能给个解释。

最新文章

  1. SqlServer--用代码创建和删除数据库或表
  2. DataTable 转 List<T>
  3. 2016中国大学生程序设计竞赛(长春) Ugly Problem 模拟+大数减法
  4. Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载
  5. catkin_make broken after intalling python 3.5 with anaconda
  6. MySQL Workbench 导出数据库脚本(图文)
  7. 墙内安装nautilus-dropbox 1.6.0-2
  8. lesson - 15 Linux系统日常管理4
  9. java.util.Arrays类详解(源码总结)
  10. Mysql存储过程历史表备份
  11. [BJOI2017]树的难题
  12. Workbench热水泵系统
  13. 对 IIC 总线的理解、调用函数以及常见面试问题
  14. 处理tcp里的粘包问题
  15. effective c++ 笔记 (30-31)
  16. 10.29训练赛第一场B题
  17. SNMP学习笔记之SNMPv3报文认证和加密
  18. JBOSS集群和安装
  19. 模拟代理安装---User-Agent Switcher for Chrome安装
  20. Zabbix分布式监控

热门文章

  1. a标签的click事件问题
  2. Http和Socket连接
  3. Azure上如何在Linux下挂载数据磁盘
  4. [置顶] lvs-tun隧道模式搭建
  5. 利用COM组件IPicture读取jpg、gif、bmp图片文件数据和显示图片
  6. 动态可视化库Vis.js:社交关系谱
  7. poj 1458 Common Subsequence_最长公共子串
  8. Aix5~6小机运维
  9. flex 载入GIF图片
  10. 使用sumlime text有感