當我們啟動一個程序,用 Process process = Process.Start(path);//path是程序的絕對路徑
啟動時,獲取的process.Handle其實是進程的句柄,並不是窗口的句柄,而有時process.MainWindowHandle卻等於0
此時就需要用枚舉來獲取啟動進程的主窗口句柄了,代碼如下
/// <summary> /// 用於枚舉子窗體是的委托 /// </summary> /// <param name="WindowHandle">窗體句柄</param> /// <param name="num">自定義</param> /// <returns></returns> public delegate bool EnumChildWindow(IntPtr WindowHandle, string num); /// <summary> /// 獲取指定窗體的所有子窗體 /// </summary> /// <param name="WinHandle">窗體句柄</param> /// <param name="ec">回調委托</param> /// <param name="name">自定義</param> /// <returns></returns> [DllImport("User32.dll")] public static extern int EnumChildWindows(IntPtr WinHandle, EnumChildWindow ecw, string name); /// <summary> /// 獲取指定窗體的標題 /// </summary> /// <param name="WinHandle">窗體句柄</param> /// <param name="Title">緩沖區取用於存儲標題</param> /// <param name="size">緩沖區大小</param> /// <returns></returns> [DllImport("User32.dll")] public static extern int GetWindowText(IntPtr WinHandle, StringBuilder Title, int size); /// <summary> /// 獲取窗體類型 /// </summary> /// <param name="WinHandle">窗體句柄</param> /// <param name="Type">類型</param> /// <param name="size">緩沖區大小</param> /// <returns></returns> [DllImport("user32.dll")] public static extern int GetClassName(IntPtr WinHandle, StringBuilder Type, int size); /// <summary> /// 根據句柄獲得進程id值 /// </summary> /// <param name="handle">句柄</param> /// <param name="pid"></param> /// <returns></returns> [DllImport("user32")] private static extern int GetWindowThreadProcessId(IntPtr handle, out int pid); IntPtr mainHwnd = IntPtr.Zero;//登錄窗口句柄 string typeName = string.Empty;//啟動程序的窗口標題 /// <summary> /// 枚舉窗體 /// </summary> /// <param name="handle"></param> /// <param name="num"></param> /// <returns></returns> 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; }