/// <summary>
        /// Returns all matching windows with a given window filter.
        /// </summary>
        /// <param name="filter">The window filter</param>
        /// <returns>A generic collection with IntPtr objects (The window handles)</returns>
        private static IEnumerable <IntPtr> FindWindows(WinApi.EnumWindowProc filter)
        {
            var windowHandles = new List <IntPtr>();

            WinApi.EnumWindows(delegate(IntPtr hWnd, IntPtr param)
            {
                if (filter(hWnd, param))
                {
                    windowHandles.Add(hWnd);
                }

                return(true);
            }, IntPtr.Zero);

            return(windowHandles);
        }
        /// <summary>
        /// Returns a list of child windows (window handles) of a given parent window
        /// </summary>
        /// <param name="parent">The window handle of the parent window</param>
        /// <returns>The list with child window handles</returns>
        public static List <IntPtr> GetChildWindows(IntPtr parent)
        {
            var result     = new List <IntPtr>();
            var listHandle = GCHandle.Alloc(result);

            try
            {
                var childProc = new WinApi.EnumWindowProc(EnumWindow);
                WinApi.EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
            }
            finally
            {
                if (listHandle.IsAllocated)
                {
                    listHandle.Free();
                }
            }

            return(result);
        }