From c241d48df3aef03f2e41582fd465d59bfe788fdb Mon Sep 17 00:00:00 2001 From: vhanla Date: Tue, 7 Apr 2020 17:02:14 -0500 Subject: [PATCH 01/27] Better app listing like Alt-Tab supports UWP apps and hidden apps running including in another Virtual Desktops (#1956) * Better app listing like Alt-Tab supports UWP apps and hidden apps running in another virtual desktop just like Windows Alt-Tab * Modified not to hide cloaked apps i.e. also show apps running in another virtual desktop * Improved listing apps, with readability and reusable abstract properties. Including a function to detect cloaked UWP apps for future use. --- .../Components/InteropAndHelpers.cs | 187 ++++++++++++++++++ .../Window Walker/Components/OpenWindows.cs | 17 +- .../app/Window Walker/Components/Window.cs | 81 ++++++++ 3 files changed, 271 insertions(+), 14 deletions(-) diff --git a/src/modules/windowwalker/app/Window Walker/Components/InteropAndHelpers.cs b/src/modules/windowwalker/app/Window Walker/Components/InteropAndHelpers.cs index 3ebe543fb1..9d9dcb8aa3 100644 --- a/src/modules/windowwalker/app/Window Walker/Components/InteropAndHelpers.cs +++ b/src/modules/windowwalker/app/Window Walker/Components/InteropAndHelpers.cs @@ -594,9 +594,187 @@ namespace WindowWalker.Components } } + /// + /// GetWindow relationship between the specified window and the window whose handle is to be retrieved. + /// + public enum GetWindowCmd : uint + { + /// + /// The retrieved handle identifies the window of the same type that is highest in the Z order. + /// + GW_HWNDFIRST = 0, + /// + /// The retrieved handle identifies the window of the same type that is lowest in the Z order. + /// + GW_HWNDLAST = 1, + /// + /// The retrieved handle identifies the window below the specified window in the Z order. + /// + GW_HWNDNEXT = 2, + /// + /// The retrieved handle identifies the window above the specified window in the Z order. + /// + GW_HWNDPREV = 3, + /// + /// The retrieved handle identifies the specified window's owner window, if any. + /// + GW_OWNER = 4, + /// + /// The retrieved handle identifies the child window at the top of the Z order, if the specified window + /// is a parent window. + /// + GW_CHILD = 5, + /// + /// The retrieved handle identifies the enabled popup window owned by the specified window. + /// + GW_ENABLEDPOPUP = 6 + } + + /// + /// GetWindowLong index to retrieves the extended window styles. + /// + public const int GWL_EXSTYLE = -20; + + /// + /// The following are the extended window styles + /// + [Flags] + public enum ExtendedWindowStyles : UInt32 + { + /// + /// The window has a double border; the window can, optionally, be created with a title bar by specifying + /// the WS_CAPTION style in the dwStyle parameter. + /// + WS_EX_DLGMODALFRAME = 0X0001, + /// + /// The child window created with this style does not send the WM_PARENTNOTIFY message to its parent window + /// when it is created or destroyed. + /// + WS_EX_NOPARENTNOTIFY = 0X0004, + /// + /// The window should be placed above all non-topmost windows and should stay above all non-topmost windows + /// and should stay above them, even when the window is deactivated. + /// + WS_EX_TOPMOST = 0X0008, + /// + /// The window accepts drag-drop files. + /// + WS_EX_ACCEPTFILES = 0x0010, + /// + /// The window should not be painted until siblings beneath the window (that were created by the same thread) + /// have been painted. + /// + WS_EX_TRANSPARENT = 0x0020, + /// + /// The window is a MDI child window. + /// + WS_EX_MDICHILD = 0x0040, + /// + /// The window is intended to be used as a floating toolbar. A tool window has a title bar that is shorter + /// than a normal title bar, and the window title is drawn using a smaller font. A tool window does not + /// appear in the taskbar or in the dialog that appears when the user presses ALT+TAB. + /// + WS_EX_TOOLWINDOW = 0x0080, + /// + /// The window has a border with a raised edge. + /// + WS_EX_WINDOWEDGE = 0x0100, + /// + /// The window has a border with a sunken edge. + /// + WS_EX_CLIENTEDGE = 0x0200, + /// + /// The title bar of the window includes a question mark. + /// + WS_EX_CONTEXTHELP = 0x0400, + /// + /// The window has generic "right-aligned" properties. This depends on the window class. This style has + /// an effect only if the shell language supports reading-order alignment, otherwise is ignored. + /// + WS_EX_RIGHT = 0x1000, + /// + /// The window has generic left-aligned properties. This is the default. + /// + WS_EX_LEFT = 0x0, + /// + /// If the shell language supports reading-order alignment, the window text is displayed using right-to-left + /// reading-order properties. For other languages, the styles is ignored. + /// + WS_EX_RTLREADING = 0x2000, + /// + /// The window text is displayed using left-to-right reading-order properties. This is the default. + /// + WS_EX_LTRREADING = 0x0, + /// + /// If the shell language supports reading order alignment, the vertical scroll bar (if present) is to + /// the left of the client area. For other languages, the style is ignored. + /// + WS_EX_LEFTSCROLLBAR = 0x4000, + /// + /// The vertical scroll bar (if present) is to the right of the client area. This is the default. + /// + WS_EX_RIGHTSCROLLBAR = 0x0, + /// + /// The window itself contains child windows that should take part in dialog box, navigation. If this + /// style is specified, the dialog manager recurses into children of this window when performing + /// navigation operations such as handling tha TAB key, an arrow key, or a keyboard mnemonic. + /// + WS_EX_CONTROLPARENT = 0x10000, + /// + /// The window has a three-dimensional border style intended to be used for items that do not accept + /// user input. + /// + WS_EX_STATICEDGE = 0x20000, + /// + /// Forces a top-level window onto the taskbar when the window is visible. + /// + WS_EX_APPWINDOW = 0x40000, + /// + /// The window is an overlapped window. + /// + WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE, + /// + /// The window is palette window, which is a modeless dialog box that presents an array of commands. + /// + WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST, + /// + /// The window is a layered window. This style cannot be used if the window has a class style of either + /// CS_OWNDC or CS_CLASSDC. Only for top level window before Windows 8, and child windows from Windows 8. + /// + WS_EX_LAYERED = 0x80000, + /// + /// The window does not pass its window layout to its child windows. + /// + WS_EX_NOINHERITLAYOUT = 0x100000, + /// + /// If the shell language supports reading order alignment, the horizontal origin of the window is on the + /// right edge. Increasing horizontal values advance to the left. + /// + WS_EX_LAYOUTRTL = 0x400000, + /// + /// Paints all descendants of a window in bottom-to-top painting order using double-buffering. + /// Bottom-to-top painting order allows a descendent window to have translucency (alpha) and + /// transparency (color-key) effects, but only if the descendent window also has the WS_EX_TRANSPARENT + /// bit set. Double-buffering allows the window and its descendents to be painted without flicker. + /// + WS_EX_COMPOSITED = 0x2000000, + /// + /// A top-level window created with this style does not become the foreground window when the user + /// clicks it. The system does not bring this window to the foreground when the user minimizes or closes + /// the foreground window. + /// + WS_EX_NOACTIVATE = 0x8000000 + } + [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int EnumWindows(CallBackPtr callPtr, int lPar); + [DllImport("user32.dll", SetLastError = true)] + public static extern IntPtr GetWindow(IntPtr hWnd, GetWindowCmd uCmd); + + [DllImport("user32.dll", SetLastError = true)] + public static extern int GetWindowLong(IntPtr hWnd, int nIndex); + [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount); @@ -606,6 +784,9 @@ namespace WindowWalker.Components [DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr hWnd); + [DllImport("user32.dll")] + public static extern bool IsWindow(IntPtr hWnd); + [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, SetWindowPosFlags uFlags); @@ -633,6 +814,9 @@ namespace WindowWalker.Components [DllImport("psapi.dll")] public static extern uint GetProcessImageFileName(IntPtr hProcess, [Out] StringBuilder lpImageFileName, [In] [MarshalAs(UnmanagedType.U4)] int nSize); + [DllImport("user32.dll", SetLastError = true)] + public static extern IntPtr GetProp(IntPtr hWnd, string lpString); + [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId); @@ -642,6 +826,9 @@ namespace WindowWalker.Components [DllImport("dwmapi.dll", PreserveSig = false)] public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); + [DllImport("dwmapi.dll", PreserveSig = false)] + public static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out int pvAttribute, int cbAttribute); + [DllImport("user32.dll")] public static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); diff --git a/src/modules/windowwalker/app/Window Walker/Components/OpenWindows.cs b/src/modules/windowwalker/app/Window Walker/Components/OpenWindows.cs index 968089401b..e65dd2913a 100644 --- a/src/modules/windowwalker/app/Window Walker/Components/OpenWindows.cs +++ b/src/modules/windowwalker/app/Window Walker/Components/OpenWindows.cs @@ -94,22 +94,11 @@ namespace WindowWalker.Components { Window newWindow = new Window(hwnd); - if (windows.Select(x => x.Title).Contains(newWindow.Title)) - { - if (newWindow.ProcessName.ToLower().Equals("applicationframehost.exe")) - { - windows.Remove(windows.Where(x => x.Title == newWindow.Title).First()); - } - - return true; - } - - if ((newWindow.Visible && !newWindow.ProcessName.ToLower().Equals("iexplore.exe")) || - (newWindow.ProcessName.ToLower().Equals("iexplore.exe") && newWindow.ClassName == "TabThumbnailWindow")) + if (newWindow.IsWindow && newWindow.Visible && newWindow.IsOwner && + (!newWindow.IsToolWindow || newWindow.IsAppWindow ) && !newWindow.TaskListDeleted && + newWindow.ClassName != "Windows.UI.Core.CoreWindow") { windows.Add(newWindow); - - OnOpenWindowsUpdate?.Invoke(this, new SearchController.SearchResultUpdateEventArgs()); } return true; diff --git a/src/modules/windowwalker/app/Window Walker/Components/Window.cs b/src/modules/windowwalker/app/Window Walker/Components/Window.cs index ea7f73c53e..85a062c7ad 100644 --- a/src/modules/windowwalker/app/Window Walker/Components/Window.cs +++ b/src/modules/windowwalker/app/Window Walker/Components/Window.cs @@ -168,6 +168,87 @@ namespace WindowWalker.Components } } + /// + /// Determines whether the specified window handle identifies an existing window. + /// + public bool IsWindow + { + get + { + return InteropAndHelpers.IsWindow(Hwnd); + } + } + + /// + /// Get a value indicating whether is the window GWL_EX_STYLE is a toolwindow + /// + public bool IsToolWindow + { + get + { + return (InteropAndHelpers.GetWindowLong(Hwnd, InteropAndHelpers.GWL_EXSTYLE) & + (uint)InteropAndHelpers.ExtendedWindowStyles.WS_EX_TOOLWINDOW) == + (uint)InteropAndHelpers.ExtendedWindowStyles.WS_EX_TOOLWINDOW; + } + } + + /// + /// Get a value indicating whether the window GWL_EX_STYLE is an appwindow + /// + public bool IsAppWindow + { + get + { + return (InteropAndHelpers.GetWindowLong(Hwnd, InteropAndHelpers.GWL_EXSTYLE) & + (uint)InteropAndHelpers.ExtendedWindowStyles.WS_EX_APPWINDOW) == + (uint)InteropAndHelpers.ExtendedWindowStyles.WS_EX_APPWINDOW; + } + } + + /// + /// Get a value indicating whether the window has ITaskList_Deleted property + /// + public bool TaskListDeleted + { + get + { + return InteropAndHelpers.GetProp(Hwnd, "ITaskList_Deleted") != IntPtr.Zero; + } + } + + /// + /// Get a value indicating whether the app is a cloaked UWP app + /// + public bool IsUWPCloaked + { + get + { + return (this.IsWindowCloaked() && this.ClassName == "ApplicationFrameWindow"); + } + } + + /// + /// Determines whether the specified windows is the owner + /// + public bool IsOwner + { + get + { + return InteropAndHelpers.GetWindow(Hwnd, InteropAndHelpers.GetWindowCmd.GW_OWNER) != null; + } + } + + /// + /// Gets a value indicating whether is the window cloaked. To detect UWP apps in background or win32 apps running in another virtual desktop + /// + public bool IsWindowCloaked() + { + int isCloaked = 0; + const int DWMWA_CLOAKED = 14; + InteropAndHelpers.DwmGetWindowAttribute(this.hwnd, DWMWA_CLOAKED, out isCloaked, sizeof(int)); + return isCloaked != 0; + } + /// /// Gets a value indicating whether returns true if the window is minimized /// From 4f29f998c5a19249f3fe830a96844e7a82ce03e9 Mon Sep 17 00:00:00 2001 From: Arjun Balgovind <32061677+arjunbalgovind@users.noreply.github.com> Date: Tue, 7 Apr 2020 15:19:22 -0700 Subject: [PATCH 02/27] Fixed telemetry calls in Image Resizer (#1983) --- src/modules/imageresizer/dll/ContextMenuHandler.cpp | 10 +++++----- src/modules/imageresizer/dll/trace.cpp | 10 ++++++++++ src/modules/imageresizer/dll/trace.h | 1 + 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/modules/imageresizer/dll/ContextMenuHandler.cpp b/src/modules/imageresizer/dll/ContextMenuHandler.cpp index 556a0b1891..b10cdfb91c 100644 --- a/src/modules/imageresizer/dll/ContextMenuHandler.cpp +++ b/src/modules/imageresizer/dll/ContextMenuHandler.cpp @@ -147,6 +147,7 @@ HRESULT CContextMenuHandler::QueryContextMenu(_In_ HMENU hmenu, UINT indexMenu, if (!InsertMenuItem(hmenu, indexMenu, TRUE, &mii)) { hr = HRESULT_FROM_WIN32(GetLastError()); + Trace::QueryContextMenuError(hr); } else { @@ -220,12 +221,12 @@ HRESULT CContextMenuHandler::ResizePictures(CMINVOKECOMMANDINFO* pici, IShellIte HRESULT hr = E_FAIL; if (!CreatePipe(&hReadPipe, &hWritePipe, &sa, 0)) { - Trace::InvokedRet(hr); + hr = HRESULT_FROM_WIN32(GetLastError()); return hr; } if (!SetHandleInformation(hWritePipe, HANDLE_FLAG_INHERIT, 0)) { - Trace::InvokedRet(hr); + hr = HRESULT_FROM_WIN32(GetLastError()); return hr; } CAtlFile writePipe(hWritePipe); @@ -277,12 +278,12 @@ HRESULT CContextMenuHandler::ResizePictures(CMINVOKECOMMANDINFO* pici, IShellIte delete[] lpszCommandLine; if (!CloseHandle(processInformation.hProcess)) { - Trace::InvokedRet(hr); + hr = HRESULT_FROM_WIN32(GetLastError()); return hr; } if (!CloseHandle(processInformation.hThread)) { - Trace::InvokedRet(hr); + hr = HRESULT_FROM_WIN32(GetLastError()); return hr; } @@ -322,7 +323,6 @@ HRESULT CContextMenuHandler::ResizePictures(CMINVOKECOMMANDINFO* pici, IShellIte writePipe.Close(); hr = S_OK; - Trace::InvokedRet(hr); return hr; } diff --git a/src/modules/imageresizer/dll/trace.cpp b/src/modules/imageresizer/dll/trace.cpp index 8df63836f5..8bf2d84280 100644 --- a/src/modules/imageresizer/dll/trace.cpp +++ b/src/modules/imageresizer/dll/trace.cpp @@ -47,3 +47,13 @@ void Trace::InvokedRet(_In_ HRESULT hr) noexcept TraceLoggingHResult(hr), TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); } + +void Trace::QueryContextMenuError(_In_ HRESULT hr) noexcept +{ + TraceLoggingWrite( + g_hProvider, + "ImageResizer_QueryContextMenuError", + ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), + TraceLoggingHResult(hr), + TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); +} diff --git a/src/modules/imageresizer/dll/trace.h b/src/modules/imageresizer/dll/trace.h index fcb39a3757..5f1bada262 100644 --- a/src/modules/imageresizer/dll/trace.h +++ b/src/modules/imageresizer/dll/trace.h @@ -8,4 +8,5 @@ public: static void EnableImageResizer(_In_ bool enabled) noexcept; static void Invoked() noexcept; static void InvokedRet(_In_ HRESULT hr) noexcept; + static void QueryContextMenuError(_In_ HRESULT hr) noexcept; }; \ No newline at end of file From cb454734b0d2b72b03575522364697403583bb45 Mon Sep 17 00:00:00 2001 From: "Betsegaw (Beta) Tadele" Date: Tue, 7 Apr 2020 15:22:17 -0700 Subject: [PATCH 03/27] [Window Walker] Handle UWP process names (#1858) * Fixed UWP app search * Use new methods * Updated comments --- .../Components/InteropAndHelpers.cs | 3 + .../app/Window Walker/Components/Window.cs | 63 +++++++++++++++++-- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/modules/windowwalker/app/Window Walker/Components/InteropAndHelpers.cs b/src/modules/windowwalker/app/Window Walker/Components/InteropAndHelpers.cs index 9d9dcb8aa3..1f90405c0b 100644 --- a/src/modules/windowwalker/app/Window Walker/Components/InteropAndHelpers.cs +++ b/src/modules/windowwalker/app/Window Walker/Components/InteropAndHelpers.cs @@ -775,6 +775,9 @@ namespace WindowWalker.Components [DllImport("user32.dll", SetLastError = true)] public static extern int GetWindowLong(IntPtr hWnd, int nIndex); + [DllImport("user32.dll", CharSet = CharSet.Unicode)] + public static extern int EnumChildWindows(IntPtr hWnd, CallBackPtr callPtr, int lPar); + [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount); diff --git a/src/modules/windowwalker/app/Window Walker/Components/Window.cs b/src/modules/windowwalker/app/Window Walker/Components/Window.cs index 85a062c7ad..0aa84eafdb 100644 --- a/src/modules/windowwalker/app/Window Walker/Components/Window.cs +++ b/src/modules/windowwalker/app/Window Walker/Components/Window.cs @@ -8,6 +8,7 @@ using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; +using System.Threading.Tasks; using System.Windows; using System.Windows.Interop; using System.Windows.Media; @@ -71,6 +72,8 @@ namespace WindowWalker.Components get { return hwnd; } } + public uint ProcessID { get; set; } + /// /// Gets returns the name of the process /// @@ -88,11 +91,9 @@ namespace WindowWalker.Components if (!_handlesToProcessCache.ContainsKey(Hwnd)) { - InteropAndHelpers.GetWindowThreadProcessId(Hwnd, out uint processId); - IntPtr processHandle = InteropAndHelpers.OpenProcess(InteropAndHelpers.ProcessAccessFlags.AllAccess, true, (int)processId); - StringBuilder processName = new StringBuilder(MaximumFileNameLength); + var processName = GetProcessNameFromWindowHandle(Hwnd); - if (InteropAndHelpers.GetProcessImageFileName(processHandle, processName, MaximumFileNameLength) != 0) + if (processName.Length != 0) { _handlesToProcessCache.Add( Hwnd, @@ -104,6 +105,27 @@ namespace WindowWalker.Components } } + if (_handlesToProcessCache[hwnd].ToLower() == "applicationframehost.exe") + { + new Task(() => + { + InteropAndHelpers.CallBackPtr callbackptr = new InteropAndHelpers.CallBackPtr((IntPtr hwnd, IntPtr lParam) => + { + var childProcessId = GetProcessIDFromWindowHandle(hwnd); + if (childProcessId != this.ProcessID) + { + _handlesToProcessCache[Hwnd] = GetProcessNameFromWindowHandle(hwnd); + return false; + } + else + { + return true; + } + }); + InteropAndHelpers.EnumChildWindows(Hwnd, callbackptr, 0); + }).Start(); + } + return _handlesToProcessCache[hwnd]; } } @@ -342,5 +364,38 @@ namespace WindowWalker.Components Maximized, Unknown, } + + /// + /// Gets the name of the process using the window handle + /// + /// The handle to the window + /// A string representing the process name or an empty string if the function fails + private string GetProcessNameFromWindowHandle(IntPtr hwnd) + { + uint processId = GetProcessIDFromWindowHandle(hwnd); + ProcessID = processId; + IntPtr processHandle = InteropAndHelpers.OpenProcess(InteropAndHelpers.ProcessAccessFlags.AllAccess, true, (int)processId); + StringBuilder processName = new StringBuilder(MaximumFileNameLength); + + if (InteropAndHelpers.GetProcessImageFileName(processHandle, processName, MaximumFileNameLength) != 0) + { + return processName.ToString().Split('\\').Reverse().ToArray()[0]; + } + else + { + return string.Empty; + } + } + + /// + /// Gets the process ID for the Window handle + /// + /// The handle to the window + /// The process ID + private uint GetProcessIDFromWindowHandle(IntPtr hwnd) + { + InteropAndHelpers.GetWindowThreadProcessId(hwnd, out uint processId); + return processId; + } } } From 5e56c6620166ec95e81e95f192645ade69e26ee0 Mon Sep 17 00:00:00 2001 From: Andrey Nekrasov Date: Wed, 8 Apr 2020 13:19:58 +0300 Subject: [PATCH 04/27] msi: fix icon bug due to wix quirk (#2001) --- installer/PowerToysSetup/Product.wxs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/installer/PowerToysSetup/Product.wxs b/installer/PowerToysSetup/Product.wxs index 893dea5d88..cfd75beaff 100644 --- a/installer/PowerToysSetup/Product.wxs +++ b/installer/PowerToysSetup/Product.wxs @@ -32,8 +32,8 @@ = 17134)]]> - - + + @@ -228,7 +228,7 @@ Description="PowerToys - Windows system utilities to maximize productivity" Directory="ApplicationProgramsFolder" WorkingDirectory="INSTALLFOLDER" - Icon="powertoys.ico" + Icon="powertoys.exe" IconIndex="0" Advertise="yes"> @@ -500,7 +500,7 @@ Description="PowerToys - Windows system utilities to maximize productivity" Target="[!PowerToys.exe]" WorkingDirectory="INSTALLFOLDER" - Icon="powertoys.ico" + Icon="powertoys.exe" Directory="DesktopFolder"/> From 4cb89b3fc26211fdf14b9539aa7d17a76ca1ae46 Mon Sep 17 00:00:00 2001 From: Niels Laute Date: Wed, 8 Apr 2020 14:46:05 +0200 Subject: [PATCH 05/27] FZ - Styling updates to GridZone and CanvasZone controls so they look more Fluent (#1778) * Improved styling so it looks more Fluent and native to W10 * CanvasZone border is now using the active accent color * Updated GridZone to a similiar Fluent styling as the CanvasZone. Added a mouseover state to the GridResizer. --- .../editor/FancyZonesEditor/App.xaml | 4 + .../editor/FancyZonesEditor/CanvasZone.xaml | 142 +++++++++++++----- .../editor/FancyZonesEditor/GridResizer.xaml | 8 +- .../editor/FancyZonesEditor/GridZone.xaml | 12 +- .../editor/FancyZonesEditor/GridZone.xaml.cs | 6 +- 5 files changed, 122 insertions(+), 50 deletions(-) diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml b/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml index 2d445b51fe..8baea2aed9 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml +++ b/src/modules/fancyzones/editor/FancyZonesEditor/App.xaml @@ -12,6 +12,10 @@ + + + + diff --git a/src/modules/fancyzones/editor/FancyZonesEditor/CanvasZone.xaml b/src/modules/fancyzones/editor/FancyZonesEditor/CanvasZone.xaml index 7ed22d9d5f..ec036867a0 100644 --- a/src/modules/fancyzones/editor/FancyZonesEditor/CanvasZone.xaml +++ b/src/modules/fancyzones/editor/FancyZonesEditor/CanvasZone.xaml @@ -5,51 +5,113 @@ xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:FancyZonesEditor" mc:Ignorable="d" - Background="LightGray" - Opacity="0.75" + Background="Transparent" d:DesignHeight="450" d:DesignWidth="800"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -