public WindowInformation[] FindWindows(WindowFilterCriteria filterCriteria)
        {
            ArgumentUtility.CheckNotNull("filterCriteria", filterCriteria);

            var context = CreateWindowFinderEnumWindowsProcContext(filterCriteria);

            if (!_nativeMethods.EnumWindows(EnumWindowsCallback, context))
            {
                throw CreateWin32ExceptionForError(_nativeMethods.GetLastWin32Error(), "Error executing 'EnumWindows'.");
            }

            return(context.Windows.ToArray());
        }
 private WindowFinderEnumWindowsProcContext CreateWindowFinderEnumWindowsProcContext(WindowFilterCriteria filterCriteria)
 {
     return(new WindowFinderEnumWindowsProcContext(
                _nativeMethods,
                filterCriteria.ExcludeOwnProcess ? _currentProcessID : (int?)null,
                filterCriteria.ProcessID,
                filterCriteria.ClassName,
                filterCriteria.WindowTitle,
                filterCriteria.IncludeChildWindows
                ));
 }