// Copyright (c) Microsoft Corporation // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. // Code forked from Betsegaw Tadele's https://github.com/betsegaw/windowwalker/ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Wox.Plugin.Common.Win32; namespace Microsoft.Plugin.WindowWalker.Components { /// /// Class that represents the state of the desktops windows /// internal class OpenWindows { /// /// PowerLauncher main executable /// private static readonly string _powerLauncherExe = Path.GetFileName(Process.GetCurrentProcess().MainModule.FileName); /// /// List of all the open windows /// private readonly List windows = new List(); /// /// An instance of the class OpenWindows /// private static OpenWindows instance; /// /// Gets the list of all open windows /// public List Windows { get { return new List(windows); } } /// /// Gets an instance property of this class that makes sure that /// the first instance gets created and that all the requests /// end up at that one instance /// public static OpenWindows Instance { get { if (instance == null) { instance = new OpenWindows(); } return instance; } } /// /// Initializes a new instance of the class. /// Private constructor to make sure there is never /// more than one instance of this class /// private OpenWindows() { } /// /// Updates the list of open windows /// public void UpdateOpenWindowsList() { windows.Clear(); EnumWindowsProc callbackptr = new EnumWindowsProc(WindowEnumerationCallBack); _ = NativeMethods.EnumWindows(callbackptr, 0); } /// /// Call back method for window enumeration /// /// The handle to the current window being enumerated /// Value being passed from the caller (we don't use this but might come in handy /// in the future /// true to make sure to continue enumeration public bool WindowEnumerationCallBack(IntPtr hwnd, IntPtr lParam) { Window newWindow = new Window(hwnd); if (newWindow.IsWindow && newWindow.Visible && newWindow.IsOwner && (!newWindow.IsToolWindow || newWindow.IsAppWindow) && !newWindow.TaskListDeleted && newWindow.ClassName != "Windows.UI.Core.CoreWindow" && newWindow.ProcessInfo.Name != _powerLauncherExe) { // To hide (not add) preloaded uwp app windows that are invisible to the user we check the cloak state in DWM to be "none". (Issue #13637.) // (If user asking to see these windows again we can add an optional plugin setting in the future.) // [@htcfreek, 2022-02-01: Removed the IsCloaked check to list windows from virtual desktops other than the current one again (#15887). In a second PR I will fix it re-implement it with improved code again.] // if (!newWindow.IsCloaked) // { windows.Add(newWindow); // } } return true; } } }