1. 程式人生 > 其它 >獲取程序/主視窗的控制代碼

獲取程序/主視窗的控制代碼

獲取程序/主視窗的控制代碼

通過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;
        }

  通過以上的方式,便可以獲取我們想要的程序的主窗體控制代碼了