public static IEnumerable <WinHandle> FindWindows(Predicate <WinHandle> pred)
        {
            if (pred == null)
            {
                throw new ArgumentNullException(nameof(pred));
            }

            List <WinHandle> winList = null;

            NtApi.EnumWindows((ptr, lp) =>
            {
                var win = new WinHandle(ptr);

                if (pred.Invoke(win))
                {
                    if (winList == null)
                    {
                        winList = new List <WinHandle>();
                    }
                    winList.Add(win);
                }

                return(NtApi.EnumWindowsContinueEnumerating);
            }, IntPtr.Zero);

            return(winList ?? Enumerable.Empty <WinHandle>());
        }
        public static WinHandle FindWindow(Predicate <WinHandle> pred)
        {
            if (pred == null)
            {
                throw new ArgumentNullException(nameof(pred));
            }

            var ret = WinHandle.Invalid;

            NtApi.EnumWindows((ptr, lp) =>
            {
                var win = new WinHandle(ptr);
                if (pred.Invoke(win))
                {
                    ret = win;
                    return(NtApi.EnumWindowsStopEnumerating);
                }

                return(NtApi.EnumWindowsContinueEnumerating);
            }, IntPtr.Zero);

            return(ret);
        }