public List <Window> FindAllWindows(IntPtr handler = default(IntPtr))
        {
            List <IntPtr> hwnds = new List <IntPtr>();

            IntPtr mainWindowHwnd;

            if (handler == IntPtr.Zero)
            {
                System.Threading.Thread.Sleep(200);
                mainWindowHwnd = _process.MainWindowHandle;
            }
            else
            {
                mainWindowHwnd = handler;
            }

            hwnds.Add(mainWindowHwnd);
            hwnds.AddRange(_process.GetAllWindows());

            List <Window> allChildWindows = new List <Window>();

            var menu = new Menu(IntPtr.Zero, Win32Helpers.GetMenu(mainWindowHwnd), mainWindowHandle: mainWindowHwnd);

            foreach (var childWindow in allChildWindows.ToList())
            {
                allChildWindows.AddRange(childWindow.FindAllWindows());
            }

            allChildWindows.OrderBy(w => (int)w.Handler);

            allChildWindows.RemoveAll(w => string.IsNullOrEmpty(w.Text));

            foreach (var window in allChildWindows)
            {
                Console.WriteLine(window.Text);
            }

            return(allChildWindows);
        }