博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#遍历进程获取主窗口句柄
阅读量:5782 次
发布时间:2019-06-18

本文共 2575 字,大约阅读时间需要 8 分钟。

当我们启动一个程序,用 Process process = Process.Start(path);//path是程序的绝对路径

启动时,获取的process.Handle其实是进程的句柄,并不是窗口的句柄,而有时process.MainWindowHandle却等于0

此时就需要用枚举来获取启动进程的主窗口句柄了,代码如下

///     /// 用于枚举子窗体是的委托    ///     /// 窗体句柄    /// 自定义    /// 
public delegate bool EnumChildWindow(IntPtr WindowHandle, string num); /// /// 获取指定窗体的所有子窗体 /// /// 窗体句柄 /// 回调委托 /// 自定义 ///
[DllImport("User32.dll")] public static extern int EnumChildWindows(IntPtr WinHandle, EnumChildWindow ecw, string name); /// /// 获取指定窗体的标题 /// /// 窗体句柄 /// 缓冲区取用于存储标题 /// 缓冲区大小 ///
[DllImport("User32.dll")] public static extern int GetWindowText(IntPtr WinHandle, StringBuilder Title, int size); /// /// 获取窗体类型 /// /// 窗体句柄 /// 类型 /// 缓冲区大小 ///
[DllImport("user32.dll")] public static extern int GetClassName(IntPtr WinHandle, StringBuilder Type, int size); /// /// 根据句柄获得进程id值 /// /// 句柄 /// ///
[DllImport("user32")] private static extern int GetWindowThreadProcessId(IntPtr handle, out int pid); IntPtr mainHwnd = IntPtr.Zero;//登录窗口句柄string typeName = string.Empty;//启动程序的窗口标题 /// /// 枚举窗体 /// /// /// ///
private bool EnumChild(IntPtr handle, string num) { StringBuilder title = new StringBuilder(); //StringBuilder type = new StringBuilder(); title.Length = 100; //type.Length = 100; GetWindowText(handle, title, 100);//取标题 //GetClassName(handle, type, 100);//取类型 if (title.ToString() == typeName) { mainHwnd = handle; return false; } return true; }//代码调用pubilc boolTest(){ FileVersionInfo myFileVersion = FileVersionInfo.GetVersionInfo(path); typeName = myFileVersion.ProductName;//获取程序产品名称int waitTime = 0; while (true) { EnumChildWindow ecw = new EnumChildWindow(EnumChild); EnumChildWindows(mainWindowHandle, ecw, ""); GetWindowRect(mainHwnd.ToInt32(), ref rectMain); int pid = 0; GetWindowThreadProcessId(mainHwnd, out pid); //rectMain.Height - rectMain.Y < 300说明是登录窗口 if (mainHwnd != IntPtr.Zero && process.Id == pid && rectMain.Height - rectMain.Y < 300)//276 break; waitTime++; //30秒没打开程序,登录失败 if (waitTime >= 30) return false; Thread.Sleep(1000); }return true;}

 

转载地址:http://hecyx.baihongyu.com/

你可能感兴趣的文章
每日文献:2018-01-25
查看>>
虚拟化篇之前后端驱动分析
查看>>
用HTML5开发一个小游戏
查看>>
《花,你何时的绚烂》(三)
查看>>
Mysql 密码忘记如何修改密码
查看>>
WRF主程序与WPS的编译与安装
查看>>
服务器文件双向、多向同步rsync+sersync
查看>>
RabbitMQ(从安装到使用)
查看>>
关于TensorFlow你需要了解的9件事
查看>>
深度学习笔记5:正则化与dropout
查看>>
springMVC
查看>>
200年前写了一本书,封面卖10万英镑,如今受程序员膜拜
查看>>
都在说微服务,那么微服务的反模式和陷阱是什么(一)
查看>>
计算机网络之物理层
查看>>
8- 深度学习之神经网络核心原理与算法-卷积神经网络
查看>>
Python-正则表达式总结版
查看>>
HyperLedger Fabric 1.2 超级账本起源(5.1)
查看>>
学界 | 哈佛研究者推出新型优化算法,指数级提升计算速度
查看>>
laravel 5 composer 安装 UEditor
查看>>
SSM-SpringMVC-08:SpringMVC中以继承AbstractController的方式实现处理器
查看>>