private void MenuViewFormUpdate(bool setWindowLocation = true) { appsListView.BeginUpdate(); try { appsListView.Items.Clear(); appsListView.SmallImageList?.Images.Clear(); if (!appsListView.Scrollable) { appsListView.Scrollable = true; } var largeImages = Settings.Window.LargeImages; imageList.Images.Clear(); foreach (var appData in CacheData.CurrentAppInfo) { var key = appData.Key; if (string.IsNullOrWhiteSpace(key)) { continue; } var name = appData.Name; if (string.IsNullOrWhiteSpace(name)) { continue; } Image image; if (CacheData.CurrentImages.ContainsKey(key)) { image = CacheData.CurrentImages[key]; goto Finalize; } if (CacheData.AppImages.ContainsKey(key)) { image = CacheData.AppImages[key]; goto UpdateCache; } var exePath = appData.FilePath; if (!File.Exists(exePath)) { continue; } try { var imgPath = Path.ChangeExtension(exePath, ".ico"); var indicator = largeImages ? 32 : 16; if (File.Exists(imgPath)) { exePath = imgPath; goto FromFile; } imgPath = Path.ChangeExtension(exePath, ".png"); if (!File.Exists(imgPath)) { var appDir = Path.GetDirectoryName(exePath); var imgDir = Path.Combine(appDir, "App\\AppInfo"); if (largeImages) { var sizes = new[] { 32, 40, 48, 64, 96, 128, 256 }; foreach (var size in sizes) { imgPath = Path.Combine(imgDir, $"appicon_{size}.png"); if (File.Exists(imgPath)) { break; } } } else { imgPath = Path.Combine(imgDir, "appicon_16.png"); } } if (File.Exists(imgPath)) { image = Image.FromFile(imgPath); if (image != default) { if (image.Width != image.Height || image.Width != indicator) { image = image.Redraw(indicator, indicator); } goto UpdateCache; } } if (exePath.EndsWithEx(".bat", ".cmd", ".jse", ".vbe", ".vbs")) { image = CacheData.GetSystemImage(ImageResourceSymbol.CommandPrompt, largeImages); goto UpdateCache; } FromFile: using (var ico = ResourcesEx.GetIconFromFile(exePath, 0, largeImages)) { image = ico?.ToBitmap()?.Redraw(indicator, indicator); if (image != default) { goto UpdateCache; } } } catch (Exception ex) when(ex.IsCaught()) { Log.Write(ex); } image = CacheData.GetSystemImage(ImageResourceSymbol.Application, largeImages); if (image == default) { continue; } UpdateCache: if (!CacheData.CurrentImages.ContainsKey(key)) { CacheData.CurrentImages.Add(key, image); } Finalize: imageList.Images.Add(image); appsListView.Items.Add(name, imageList.Images.Count - 1); } if (largeImages) { imageList.ImageSize = new Size(32, 32); } appsListView.SmallImageList = imageList; CacheData.UpdateCurrentImagesFile(); if (!setWindowLocation) { return; } var taskbarLocation = TaskBar.GetLocation(Handle); if (Settings.Window.DefaultPosition == 0 && taskbarLocation != TaskBarLocation.Hidden) { var screen = Screen.PrimaryScreen.WorkingArea; foreach (var scr in Screen.AllScreens) { if (!scr.Bounds.Contains(Cursor.Position)) { continue; } screen = scr.WorkingArea; break; } switch (taskbarLocation) { case TaskBarLocation.Left: case TaskBarLocation.Top: Left = screen.X; Top = screen.Y; break; case TaskBarLocation.Right: Left = screen.Width - Width; Top = screen.Y; break; default: Left = screen.X; Top = screen.Height - Height; break; } } else { Left = Cursor.Position.X - Width / 2; Top = Cursor.Position.Y - Height / 2; if (!WinApi.NativeHelper.WindowIsOutOfScreenArea(Handle, out var newRect)) { return; } Left = newRect.X; Top = newRect.Y; } } finally { appsListView.EndUpdate(); appsCount.Text = string.Format(CultureInfo.InvariantCulture, Language.GetText(appsCount), appsListView.Items.Count, appsListView.Items.Count == 1 ? Language.GetText(nameof(en_US.App)) : Language.GetText(nameof(en_US.Apps))); if (!appsListView.Focus()) { appsListView.Select(); } } }
private void MenuViewForm_Update(bool setWindowLocation = true) { Main.CheckAvailableApps(); appsListView.BeginUpdate(); try { appsListView.Items.Clear(); if (!appsListView.Scrollable) { appsListView.Scrollable = true; } imgList.Images.Clear(); var cachePath = Path.Combine(Main.TmpDir, "images.dat"); var cacheDict = new Dictionary <string, Image>(); var cacheSize = 0; string dictPath = null; Dictionary <string, Image> imgDict = null; Image defExeIcon = null; for (var i = 0; i < Main.AppsInfo.Count; i++) { var appInfo = Main.AppsInfo[i]; var longName = appInfo.LongName; if (string.IsNullOrWhiteSpace(longName)) { continue; } appsListView.Items.Add(longName, i); var shortName = appInfo.ShortName; if (File.Exists(cachePath)) { if (cacheDict?.Any() != true) { cacheDict = File.ReadAllBytes(cachePath).DeserializeObject <Dictionary <string, Image> >(); cacheSize = cacheDict.Count; } if (cacheDict?.ContainsKey(shortName) == true) { var img = cacheDict[shortName]; imgList.Images.Add(shortName, img); continue; } } if (dictPath == null) { dictPath = PathEx.Combine(PathEx.LocalDir, "Assets\\images.dat"); } if (!File.Exists(dictPath)) { goto TryHard; } if (imgDict == null) { imgDict = File.ReadAllBytes(dictPath).DeserializeObject <Dictionary <string, Image> >(); } if (imgDict == null) { goto TryHard; } if (imgDict?.ContainsKey(shortName) == true) { var img = imgDict[shortName]; imgList.Images.Add(shortName, img); cacheDict.Add(shortName, img); continue; } TryHard: try { var exePath = appInfo.ExePath; var imgPath = Path.ChangeExtension(exePath, ".png"); Image img; if (!string.IsNullOrEmpty(imgPath) && File.Exists(imgPath)) { img = Image.FromFile(imgPath); imgList.Images.Add(shortName, img); cacheDict.Add(shortName, img); continue; } var appDir = Path.GetDirectoryName(exePath); if (!string.IsNullOrEmpty(appDir) && !File.Exists(imgPath)) { imgPath = Path.Combine(appDir, "App\\AppInfo\\appicon_16.png"); } if (!string.IsNullOrEmpty(imgPath) && File.Exists(imgPath)) { img = Image.FromFile(imgPath)?.Redraw(16, 16); imgList.Images.Add(shortName, img); cacheDict.Add(shortName, img); continue; } using (var ico = ResourcesEx.GetIconFromFile(exePath)) { img = ico?.ToBitmap()?.Redraw(16, 16); if (img == null) { goto Default; } imgList.Images.Add(shortName, img); cacheDict.Add(shortName, img); continue; } } catch (Exception ex) { Log.Write(ex); } Default: if (defExeIcon == null) { defExeIcon = ResourcesEx.GetSystemIcon(ResourcesEx.IconIndex.ExeFile, Main.SystemResourcePath)?.ToBitmap().Redraw(16, 16); } if (defExeIcon == null) { continue; } imgList.Images.Add(shortName, defExeIcon); } appsListView.SmallImageList = imgList; if (cacheDict.Count > 0 && (cacheDict.Count != cacheSize || !File.Exists(cachePath))) { File.WriteAllBytes(cachePath, cacheDict.SerializeObject()); } if (!setWindowLocation) { return; } var defaultPos = Ini.Read("Settings", "Window.DefaultPosition", 0); var taskbarLocation = TaskBar.GetLocation(Handle); if (defaultPos == 0 && taskbarLocation != TaskBar.Location.Hidden) { var screen = Screen.PrimaryScreen.WorkingArea; foreach (var scr in Screen.AllScreens) { if (!scr.Bounds.Contains(Cursor.Position)) { continue; } screen = scr.WorkingArea; break; } switch (taskbarLocation) { case TaskBar.Location.Left: case TaskBar.Location.Top: Left = screen.X; Top = screen.Y; break; case TaskBar.Location.Right: Left = screen.Width - Width; Top = screen.Y; break; default: Left = screen.X; Top = screen.Height - Height; break; } } else { var newLocation = GetWindowStartPos(new Point(Width, Height)); Left = newLocation.X; Top = newLocation.Y; } } finally { appsListView.EndUpdate(); appsCount.Text = string.Format(Lang.GetText(appsCount), appsListView.Items.Count, appsListView.Items.Count == 1 ? Lang.GetText(nameof(en_US.App)) : Lang.GetText(nameof(en_US.Apps))); if (!appsListView.Focus()) { appsListView.Select(); } } }