獲取程序/主視窗的控制代碼
阿新 • • 發佈:2022-02-13
獲取程序/主視窗的控制代碼
通過Process的MainWindowHandle的方式不一定獲取到到控制代碼,因此我們需要結束Win32的Api來來獲取
Win32的Api中有EnumWindows可以列舉中所有的窗體,通過繼承id和程序名的方式進行匹配,便可以獲取到指定的程序的主窗體的控制代碼
具體的程式碼如下:
/// <summary> /// 列舉窗體的回撥 /// </summary> /// <param name="hwnd"></param> /// <param name="lParam"></param> /// <returns></returns> public delegate bool EnumWindowsCallBack(IntPtr hwnd, IntPtr lParam); /// <summary> /// 枚舉出窗體 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <returns></returns> [DllImport("user32")] public static extern int EnumWindows(EnumWindowsCallBack x, IntPtr y); /// <summary> /// 獲取窗體的名稱 /// </summary> /// <param name="hWnd"></param> /// <param name="lpString"></param> /// <param name="nMaxCount"></param> /// <returns></returns> [DllImport("user32.dll")] public static extern int GetWindowTextW(IntPtr hWnd, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder lpString, int nMaxCount); [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); /// <summary> /// 列舉方式獲取控制代碼 /// </summary> /// <param name="process"></param> public static IntPtr EnumWindows(Process process) { IntPtr msgPtr = Marshal.StringToHGlobalAnsi(_processName + "^" + process.Id); IntPtr handle=IntPtr.Zero; EnumWindows(new EnumWindowsCallBack((hwnd, lpam) => { var msgs = (Marshal.PtrToStringAnsi(lpam)).Split('^'); if (msgs.Length < 2) return false;//停止列舉 string msg = msgs[0]; var lpid = int.Parse(msgs[1]); StringBuilder sb = new StringBuilder(256); GetWindowTextW(hwnd, sb, sb.Capacity); GetWindowThreadProcessId(hwnd, out int pid); if (sb != null && sb.ToString().Equals(msg) && pid == lpid) { handle= hwnd; return false; //停止列舉 } return true;//繼續列舉 }), msgPtr); return handle; }
通過以上的方式,便可以獲取我們想要的程序的主窗體控制代碼了