BrightLight.Plugin.Builtin.Providers.ControlPanelProvider.SearchAsync C# (CSharp) Метод

SearchAsync() публичный Метод

public SearchAsync ( SearchQuery query, CancellationToken ct ) : Task
query SearchQuery
ct CancellationToken
Результат Task
        public async Task<SearchResultCollection> SearchAsync(SearchQuery query, CancellationToken ct)
        {
            if (string.IsNullOrWhiteSpace(query.QueryString))
                return null;

            var results = new ObservableCollection<SearchResult>();
            var resultCollection = new SearchResultCollection
            {
                Title = "Control Panel",
                Icon = new WindowsPEResourceIcon
                {
                    FilePath = @"C:\windows\system32\control.exe"
                },
                Results = results
            };

            HRESULT hresult;
            hresult = Shell32.SHGetDesktopFolder(out Shell32.IShellFolder desktopShellFolder);
            if (hresult != HRESULT.S_OK)
                throw new Exception($"Shell32.SHGetDesktopFolder returned '{hresult}'");

            hresult = Shell32.SHParseDisplayName("shell:::{ED7BA470-8E54-465E-825C-99712043E01C}", IntPtr.Zero, out Shell32.PIDL godmodePidl, 0, out Shell32.SFGAO psfgaoOut);
            if (hresult != HRESULT.S_OK)
                throw new Exception($"Shell32.SHParseDisplayName returned '{hresult}'");

            var godmodeShellFolder = (Shell32.IShellFolder)desktopShellFolder.BindToObject(godmodePidl, null, new Guid("000214E6-0000-0000-C000-000000000046"));
            if (godmodeShellFolder == null)
                throw new Exception($"BindToObject returned null");

            var itemEnum = godmodeShellFolder.EnumObjects(IntPtr.Zero, Shell32.SHCONTF.SHCONTF_CHECKING_FOR_CHILDREN | Shell32.SHCONTF.SHCONTF_FLATLIST | Shell32.SHCONTF.SHCONTF_NONFOLDERS | Shell32.SHCONTF.SHCONTF_FOLDERS | Shell32.SHCONTF.SHCONTF_INCLUDEHIDDEN | Shell32.SHCONTF.SHCONTF_INCLUDESUPERHIDDEN | Shell32.SHCONTF.SHCONTF_STORAGE);
            if (godmodeShellFolder == null)
                throw new Exception($"EnumObjects returned null");

            var itemPidlArr = new IntPtr[1];
            while (itemEnum.Next(1, itemPidlArr, out uint fetched) == HRESULT.S_OK && fetched > 0)
            {
                var combinedPidl = Shell32.PIDL.Combine(godmodePidl, itemPidlArr[0]);

                Shell32.SHCreateItemFromIDList(combinedPidl, typeof(Shell32.IShellItem2).GUID, out object shellItemObj);
                Shell32.IShellItem2 shellItem = (Shell32.IShellItem2)shellItemObj;

                try
                {
                    var extractIcon = (Shell32.IExtractIcon)godmodeShellFolder.GetUIObjectOf(IntPtr.Zero, 1, new IntPtr[] { itemPidlArr[0] }, typeof(Shell32.IExtractIcon).GUID, IntPtr.Zero);
                    var iconPathSb = new StringBuilder(255);
                    extractIcon.GetIconLocation(Shell32.GetIconLocationFlags.GIL_FORSHELL, iconPathSb, iconPathSb.Capacity, out int iconIndex, out Shell32.GetIconLocationResultFlags flags);

                    var name = shellItem.GetString(Ole32.PROPERTYKEY.System.ItemNameDisplay).ToString();
                    var parsingPath = shellItem.GetString(Ole32.PROPERTYKEY.System.ParsingPath).ToString();
                    var keywords = shellItem.GetString(Ole32.PROPERTYKEY.System.Keywords).ToString().Split(';').Select(x => x.ToLower().Trim());
                    var queryStringLc = query.QueryString.ToLower();
                    if (name.ToLower().Contains(queryStringLc) || keywords.Any(x => x.Contains(queryStringLc))) {
                        results.Add(new ActionSearchResult
                        {
                            Title = name,
                            ParentCollection = resultCollection,
                            Icon = new WindowsPEResourceIcon
                            {
                                FilePath = iconPathSb.ToString(),
                                //Index = iconIndex == -1 ? 1 : iconIndex
                                //TODO: support for iconIndex < 0 (which means: find icon by resource id instead of icon index)
                            },
                            Action = () =>
                            {
                                dynamic shell = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
                                var folder = shell.NameSpace(@"shell:::{ED7BA470-8E54-465E-825C-99712043E01C}");
                                foreach (var item in folder.Items)
                                {
                                    var itemFolder = ((string)item.path.ToString());
                                    if (itemFolder == parsingPath)
                                        item.InvokeVerb("open");
                                }
                            }
                        });
                    }
                }
                catch (Exception)
                {
                }
            }

            return resultCollection;
        }
    }
ControlPanelProvider