diff --git a/.github/actions/spell-check/allow/code.txt b/.github/actions/spell-check/allow/code.txt
index b9be3f82a47d..c344b0edca70 100644
--- a/.github/actions/spell-check/allow/code.txt
+++ b/.github/actions/spell-check/allow/code.txt
@@ -51,6 +51,7 @@ resx
runtimeconfig
srt
Stereolithography
+taskmgr
terabyte
UYVY
xbf
@@ -328,6 +329,10 @@ MRUCMPPROC
MRUINFO
REGSTR
+#Xaml
+NVI
+Storyboards
+
# Misc Win32 APIs and PInvokes
INVOKEIDLIST
MEMORYSTATUSEX
diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt
index 779a848e6bee..76ec06dd4876 100644
--- a/.github/actions/spell-check/expect.txt
+++ b/.github/actions/spell-check/expect.txt
@@ -722,6 +722,8 @@ jpnime
Jsons
jsonval
jxr
+KBSC
+kdc
keybd
KEYBDDATA
KEYBDINPUT
@@ -1085,6 +1087,7 @@ osvi
OUTOFCONTEXT
Outptr
outsettings
+outsourced
OVERLAPPEDWINDOW
Oversampling
OVERWRITEPROMPT
@@ -1147,6 +1150,8 @@ phwnd
pici
pidl
PIDLIST
+pii
+pinboard
pinfo
pinvoke
pipename
@@ -1221,6 +1226,7 @@ programdata
projectname
PROPERTYKEY
PROPVARIANT
+Prt
PRTL
prvpane
psapi
@@ -1813,6 +1819,8 @@ WNDCLASSEX
WNDCLASSEXW
WNDCLASSW
wnode
+wom
+workerw
WORKSPACESEDITOR
WORKSPACESLAUNCHER
WORKSPACESSNAPSHOTTOOL
diff --git a/.pipelines/ESRPSigning_core.json b/.pipelines/ESRPSigning_core.json
index 8851a7ffacb0..f40bd8f4c0b6 100644
--- a/.pipelines/ESRPSigning_core.json
+++ b/.pipelines/ESRPSigning_core.json
@@ -239,8 +239,12 @@
"WinUI3Apps\\PowerToys.RegistryPreview.dll",
"WinUI3Apps\\PowerToys.RegistryPreview.exe",
- "PowerToys.ShortcutGuide.exe",
- "PowerToys.ShortcutGuideModuleInterface.dll",
+ "WinUI3Apps\\PowerToys.ShortcutGuide.exe",
+ "WinUI3Apps\\PowerToys.ShortcutGuide.dll",
+ "WinUI3Apps\\PowerToys.ShortcutGuideModuleInterface.dll",
+ "WinUI3Apps\\PowerToys.ShortcutGuide.IndexYmlGenerator.dll",
+ "WinUI3Apps\\PowerToys.ShortcutGuide.IndexYmlGenerator.exe",
+ "WinUI3Apps\\ShortcutGuide.CPPProject.dll",
"PowerToys.ZoomIt.exe",
"PowerToys.ZoomItModuleInterface.dll",
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 4a488adfdb29..582faa64180e 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -139,6 +139,7 @@
+
diff --git a/NOTICE.md b/NOTICE.md
index 73a353209661..4f56378da8af 100644
--- a/NOTICE.md
+++ b/NOTICE.md
@@ -1604,3 +1604,4 @@ SOFTWARE.
- WmiLight
- WPF-UI
- WyHash
+- YamlDotNet
\ No newline at end of file
diff --git a/PowerToys.slnx b/PowerToys.slnx
index 9e14ce1a6c41..dd8ee08f9dcc 100644
--- a/PowerToys.slnx
+++ b/PowerToys.slnx
@@ -979,9 +979,16 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/devdocs/images/shortcutguide/diagram.png b/doc/devdocs/images/shortcutguide/diagram.png
deleted file mode 100644
index 12d7256828a8..000000000000
Binary files a/doc/devdocs/images/shortcutguide/diagram.png and /dev/null differ
diff --git a/doc/devdocs/modules/shortcut_guide.md b/doc/devdocs/modules/shortcut_guide.md
index f150a4456c76..9a7a0230dba7 100644
--- a/doc/devdocs/modules/shortcut_guide.md
+++ b/doc/devdocs/modules/shortcut_guide.md
@@ -9,12 +9,14 @@
[Pull Requests](https://github.com/microsoft/PowerToys/pulls?q=is%3Apr+is%3Aopen+label%3A%22Product-Shortcut+Guide%22+)
## Overview
-Shortcut Guide is a PowerToy that displays an overlay of available keyboard shortcuts when the Windows key is pressed and held. It provides a visual reference for Windows key combinations, helping users discover and utilize built-in Windows shortcuts.
+Shortcut Guide is a PowerToy that displays an overlay of available keyboard shortcuts when a user-set keyboard shortcut is pressed. It helps users discover and remember keyboard shortcuts for Windows and apps.
+
+> [!NOTE]
+> The spec for the manifest files is in development and will be linked here once available.
## Usage
-- Press and hold the Windows key to display the overlay of available shortcuts
-- Press the hotkey again to dismiss the overlay
-- The overlay displays Windows shortcuts with their corresponding actions
+- Press the user-defined hotkey to display the overlay
+- Press the hotkey again or press ESC to dismiss the overlay
## Build and Debug Instructions
@@ -25,67 +27,89 @@ Shortcut Guide is a PowerToy that displays an overlay of available keyboard shor
4. The executable is named PowerToys.ShortcutGuide.exe
### Debug
-1. Right-click the ShortcutGuide project and select 'Set as Startup Project'
+1. Right-click the ShortcutGuide.Ui project and select 'Set as Startup Project'
2. Right-click the project again and select 'Debug'
-## Code Structure
+> [!NOTE]
+> When run in debug mode, the window behaves differently than in release mode. It will not automatically close when loosing focus, it will be displayed on top of all other windows, and it is not hidden from the taskbar.
+
+## Project Structure
+
+The Shortcut Guide module consists of the following 4 projects:
+
+### [`ShortcutGuide.Ui`](/src/modules/ShortcutGuide/ShortcutGuide.Ui/ShortcutGuide.Ui.csproj
+
+This is the main UI project for the Shortcut Guide module. Upon startup it does the following tasks:
+
+1. Copies the built-in manifest files to the users manifest directory (overwriting existing files).
+2. Generate the `index.yml` manifest file.
+3. Populate the PowerToys shortcut manifest with the user-defined shortcuts.
+4. Starts the UI.
+
+### Related files in PowerToys.Interop
+
+#### [`excluded_app.cpp`](/src/modules/ShortcutGuide/ShortcutGuide.CPPProject/excluded_app.cpp)
+
+This file contains one function with the following signature:
+
+```cpp
+__declspec(dllexport) bool IsCurrentWindowExcludedFromShortcutGuide()
+```
+
+This function checks if the current window is excluded from the Shortcut Guide overlay. It returns `true` if the current window is excluded otherwise it returns `false`.
-
+#### [`tasklist_positions.cpp`](/src/modules/ShortcutGuide/ShortcutGuide.CPPProject/tasklist_positions.cpp)
-### Core Files
+This file contains helper functions to retrieve the positions of the taskbar buttons. It exports the following function:
-#### [`dllmain.cpp`](/src/modules/shortcut_guide/dllmain.cpp)
-Contains DLL boilerplate code. Implements the PowertoyModuleIface, including enable/disable functionality and GPO policy handling. Captures hotkey events and starts the PowerToys.ShortcutGuide.exe process to display the shortcut guide window.
+```cpp
+__declspec(dllexport) TasklistButton* get_buttons(HMONITOR monitor, int* size)
+```
-#### [`shortcut_guide.cpp`](/src/modules/shortcut_guide/shortcut_guide.cpp)
-Contains the module interface code. It initializes the settings values and the keyboard event listener. Defines the OverlayWindow class, which manages the overall logic and event handling for the PowerToys Shortcut Guide.
+This function retrieves the positions of the taskbar buttons for a given monitor. It returns an array of `TasklistButton` structures (max 10), which contain the position and size of each button.
-#### [`overlay_window.cpp`](/src/modules/shortcut_guide/overlay_window.cpp)
-Contains the code for loading the SVGs, creating and rendering of the overlay window. Manages and displays overlay windows with SVG graphics through two main classes:
-- D2DOverlaySVG: Handles loading, resizing, and manipulation of SVG graphics
-- D2DOverlayWindow: Manages the display and behavior of the overlay window
+`monitor` must be the monitor handle of the monitor containing the taskbar instance of which the buttons should be retrieved.
-#### [`keyboard_state.cpp`](/src/modules/shortcut_guide/keyboard_state.cpp)
-Contains helper methods for checking the current state of the keyboard.
+`size` will contain the resulting array size.
-#### [`target_state.cpp`](/src/modules/shortcut_guide/target_state.cpp)
-State machine that handles the keyboard events. It's responsible for deciding when to show the overlay, when to suppress the Start menu (if the overlay is displayed long enough), etc. Handles state transitions and synchronization to ensure the overlay is shown or hidden appropriately based on user interactions.
+It determines the positions through Windows `FindWindowEx` function.
+For the primary taskbar it searches for:
+* A window called "Shell_TrayWnd"
+* that contains a window called "ReBarWindow32"
+* that contains a window called "MSTaskSwWClass"
+* that contains a window called "MSTaskListWClass"
-#### [`trace.cpp`](/src/modules/shortcut_guide/trace.cpp)
-Contains code for telemetry.
+For any secondary taskbar it searches for:
+* A window called "Shell_SecondaryTrayWnd"
+* that contains a window called "WorkerW"
+* that contains a window called "MSTaskListWClass"
-### Supporting Files
+It then enumerates all the button elements inside "MSTaskListWClass" while skipping such with a same name (which implies the user does not use combining taskbar buttons)
-#### [`animation.cpp`](/src/modules/shortcut_guide/animation.cpp)
-Handles the timing and interpolation of animations. Calculates the current value of an animation based on elapsed time and a specified easing function.
+If this method fails, which it will for newer versions of Windows, it falls back to searching for:
+* A window called "Shell_TrayWnd" or "Shell_SecondaryTrayWnd"
+* that contains a window called "Windows.UI.Composition.DesktopWindowContentBridge"
+* that contains a window called "Windows.UI.Input.InputSite.WindowClass"
+* the first child element
-#### [`d2d_svg.cpp`](/src/modules/shortcut_guide/d2d_svg.cpp)
-Provides functionality for loading, resizing, recoloring, rendering, and manipulating SVG images using Direct2D.
+It then enumerates all the button elements inside the selected while skipping such with a same name (which implies the user does not use combining taskbar buttons) and such that do not start with "Appid:" (which are not actual taskbar buttons related to apps, but others like the widgets or the search button).
-#### [`d2d_text.cpp`](/src/modules/shortcut_guide/d2d_text.cpp)
-Handles creation, resizing, alignment, and rendering of text using Direct2D and DirectWrite.
+### [`ShortcutGuide.IndexYmlGenerator`](/src/modules/ShortcutGuide/ShortcutGuide.IndexYmlGenerator/)
-#### [`d2d_window.cpp`](/src/modules/shortcut_guide/d2d_window.cpp)
-Manages a window using Direct2D and Direct3D for rendering. Handles window creation, resizing, rendering, and destruction.
+This application generates the `index.yml` manifest file.
-#### [`native_event_waiter.cpp`](/src/modules/shortcut_guide/native_event_waiter.cpp)
-Waits for a named event and executes a specified action when the event is triggered. Uses a separate thread to handle event waiting and action execution.
+It is a separate project so that its code can be easier ported to WinGet in the future.
-#### [`tasklist_positions.cpp`](/src/modules/shortcut_guide/tasklist_positions.cpp)
-Handles retrieving and updating the positions and information of taskbar buttons in Windows.
+### [`ShortcutGuideModuleInterface`](/src/modules/ShortcutGuide/ShortcutGuideModuleInterface/ShortcutGuideModuleInterface.vcxproj)
-#### [`main.cpp`](/src/modules/shortcut_guide/main.cpp)
-The entry point for the PowerToys Shortcut Guide application. Handles initialization, ensures single instance execution, manages parent process termination, creates and displays the overlay window, and runs the main event loop.
+The module interface that handles opening and closing the user interface.
## Features and Limitations
-- The overlay displays Windows shortcuts (Windows key combinations)
-- The module supports localization, but only for the Windows controls on the left side of the overlay
+- Currently the displayed shortcuts (Except the ones from PowerToys) are not localized.
- It's currently rated as a P3 (lower priority) module
## Future Development
-A community-contributed version 2 is in development that will support:
-- Application-specific shortcuts based on the active application
-- Additional shortcuts beyond Windows key combinations
-- PowerToys shortcuts
+- Implementing with WinGet to get new shortcut manifest files
+- Adding localization support for the built-in manifest files
\ No newline at end of file
diff --git a/doc/specs/WinGet Manifest Keyboard Shortcuts schema.md b/doc/specs/WinGet Manifest Keyboard Shortcuts schema.md
new file mode 100644
index 000000000000..5dddbad27cf3
--- /dev/null
+++ b/doc/specs/WinGet Manifest Keyboard Shortcuts schema.md
@@ -0,0 +1,318 @@
+# WinGet Manifest Keyboard Shortcuts schema
+
+## 1 What this spec is about
+
+This spec provides an extension to the existing [WinGet manifest schema](https://github.com/microsoft/winget-pkgs/blob/master/doc/manifest/README.md) in form of an additional yaml file, that describes keyboard shortcuts the application provides.
+
+These yaml files are saved on a per-user base and so called manifest interpreters can then display these manifests in a human-friendly version.
+
+### 1.1 What this spec is not about
+
+This spec does not provide a way to back up or save user-defined keyboard shortcuts.
+
+## 2 Save location of manifests
+
+### 2.1 WinGet
+
+These files are saved online along with the other manifest files in the [WinGet Package repository](https://github.com/microsoft/winget-pkgs).
+
+### 2.2 Locally
+
+All manifests and one index file are saved locally under `%LocalAppData%/Microsoft/WinGet/KeyboardShortcuts`. All apps are allowed to add their manifest files there. In addition Package Managers (like WinGet) and manifest interpreters (like PowerToys Shortcut Guide) can control and add other manifests themselves.
+
+#### 2.2.1 Downloading manifests
+
+When WinGet or other package managers download a package, they should also download the corresponding keyboard shortcuts manifest file and save it in the local directory, given such a file exists in the WinGet repository.
+
+The downloader is also responsible for updating the local `index.yaml` file, which contains all the information about the different manifest files that are saved in the same directory.
+
+#### 2.2.2 Updating manifests
+
+When a manifest interpreter starts, it should download the latest version of the manifests from the WinGet repository and save them in the local directory. If a manifest interpreter is not able to download the manifests or they do not exist, it should use the locally saved manifests.
+
+The updater is also responsible for updating the local `index.yaml` file, which contains all the information about the different manifest files that are saved in the same directory.
+
+> Note: WinGet must provide a way to update the keyboard shortcuts manifests given a package id.
+
+### 2.3 File names
+
+The file name of a keyboard shortcuts file is the WinGet package identifier, plus the locale of the strings of the file and at last the `.KBSC.yaml` file extension.
+
+For example the package "test.bar" saves its manifest with `en-US` strings in `test.bar.en-US.KBSC.yaml`.
+
+#### 2.3.1 No winget package available
+
+If an application has no corresponding WinGet package its name starts with a plus (`+`) symbol.
+
+### 2.4 Reserved namespaces
+
+Every name starting with `+WindowsNT` is reserved for the Windows OS and its components.
+
+## 3 File syntax
+
+All relevant files are written in [YAML](https://yaml.org/spec).
+
+> Note: A JSON schema will be provided as soon as the spec reaches a further step
+
+### 3.1 Manifest Schema vNext Keyboard Shortcuts File
+
+```
+PackageName: # The package unique identifier
+WindowFilter: # The filter of window processes to which the shortcuts apply to
+BackgroundProcess: # Optionally allows applying WindowFilter to background processes
+Shortcuts: # List of sections with keyboard shortcuts
+ - SectionName: # Name of the category of shortcuts
+ Properties: # List of shortcuts in the category
+ - Name: # Name of the shortcut
+ Description: # Optional description of the shortcut
+ AdditionalInfo: # Optional additional information about the shortcut
+ Recommended: # Optionally determines if the shortcut is displayed in a designated recommended area
+ Shortcut: # An array of shortcuts that need to be pressed
+ - Win: # Determines if the Windows Key is part of the shortcut
+ Ctrl: # Determines if the Ctrl Key is part of the shortcut
+ Shift: # Determines if the Shift Key is part of the shortcut
+ Alt: # Determines if the Alt Key is part of the shortcut
+ Keys: # Array of keys that need to be pressed
+```
+
+Per Application/Package one or more Keyboard manifests can be declared. Every manifest must have a different locale and the same `PackageName`, `WindowFilter` and `BackgroundProcess` fields.
+
+
+ PackageName - The package unique identifier
+
+ Package identifier (see 2.1 for more information on the package identifier).
+
+
+
+
+ WindowFilter - The filter of window processes to which the shortcuts apply to
+
+ This field declares for which process name the shortcuts should be showed (To rephrase: For which processes the shortcut will have an effect if pressed). You can use an asterisk to leave out a certain part. For example `*.PowerToys.*.exe` targets all PowerToys processes and `*` apply to any process.
+
+
+
+
+ BackgroundProcess - Optionally allows applying WindowFilter to background processes.
+
+ **Optional field**
+
+ Defaults to `False`. Determines if WindowFilter should apply to background processes as well (Rephrased: When the process is running, the shortcuts will apply).
+
+
+
+
+ Shortcuts - List of sections with keyboard shortcuts
+
+ List of different section (also called categories) of shortcuts.
+
+
+
+ SectionName - Name of the category of shortcuts
+
+ Name of the section of shortcuts.
+
+**Special sections**:
+
+Special sections start with an identifier enclosed between `<` and `>`. This declares the category as a special display. If the interpreter of the manifest file can't understand the content this section should be left out.
+
+
+
+
+ Properties - List of shortcuts in the category
+
+
+
+ Name - Name of the shortcut
+
+ Name of the shortcut. This is the name that will be displayed in the interpreter.
+
+
+
+
+
+ Description - Optional description of the shortcut
+
+ Optional description of the shortcut. This is the description that will be displayed by the interpreter.
+
+
+
+ AdditionalInfo - Optional additional information about the shortcut
+
+ Array of additional information about the shortcut. This is the additional information that will be displayed by the interpreter and are not part of this manifest.
+
+ **Example**:
+
+ For example, if the shortcut is only available on a certain Windows version, this information could be added here.
+ ```yaml
+ AdditionalInfo:
+ - MinWindowsVersion: "10.0.19041.0"
+ ```
+
+
+
+ Shortcut - An array of shortcuts that need to be pressed
+
+ An array of shortcuts that need to be pressed. This allows defining sequential shortcuts that need to be pressed in order to trigger the action.
+
+
+
+
+ Win - Determines if the Windows Key is part of the shortcut
+
+ Refers to the left Windows Key on the keyboard.
+
+
+
+ Ctrl - Determines if the Ctrl Key is part of the shortcut
+
+ Refers to the left Ctrl Key on the keyboard.
+
+
+
+ Shift - Determines if the Shift Key is part of the shortcut
+
+ Refers to the left Shift Key on the keyboard.
+
+
+
+ Alt - Determines if the Alt Key is part of the shortcut
+
+ Refers to the left Alt Key on the keyboard.
+
+
+
+
+ Recommended - Optionally determines if the shortcut is displayed in a designated recommended area
+
+ **Optional field**
+
+ Defaults to `False`. Determines if the shortcut should be displayed in a designated recommended area. This is a visual hint for the user that this shortcut is important.
+
+
+
+
+ Keys - Array of keys that need to be pressed
+
+ A string array of all the keys that need to be pressed. If a number is supplied, it should be read as a [KeyCode](https://learn.microsoft.com/windows/win32/inputdev/virtual-key-codes) and displayed accordingly (based on the Keyboard Layout of the user).
+
+**Special keys**:
+
+Special keys are enclosed between `<` and `>` and correspond to a key that should be displayed in a certain way. If the interpreter of the manifest file can't understand the content, the brackets should be left out.
+
+|Name|Description|
+|----|-----------|
+|``| Corresponds to the Office key on some Windows keyboards |
+|``| Corresponds to the Copilot key on some Windows keyboards |
+|``| Corresponds to the left arrow key |
+|``| Corresponds to the right arrow key |
+|``| Corresponds to the up arrow key |
+|``| Corresponds to the down arrow key |
+|``| Corresponds to the Enter key |
+|``| Corresponds to the Space key |
+|``| Corresponds to the Tab key |
+|``| Corresponds to the Backspace key |
+|``| Corresponds to the Delete key |
+|``| Corresponds to the Insert key |
+|``| Corresponds to the Home key |
+|``| Corresponds to the End key |
+|``| Corresponds to the Print Screen key |
+|``| Corresponds to the pause key |
+|``| Corresponds to the Page Up key |
+|``| Corresponds to the Page Down key |
+|``| Corresponds to the Escape key |
+|``| Corresponds to either the left, right, up or down arrow key |
+|``| Corresponds to either the left or right arrow key |
+|``| Corresponds to either the up or down arrow key |
+|``| Corresponds to any letter that is _underlined_ in the UI |
+
+
+
+#### 3.2.2 Example
+
+```yaml
+PackageName: Microsoft.PowerToys
+WindowFilter: "*"
+BackgroundProcess: True
+Shortcuts:
+ - SectionName: General
+ Properties:
+ - Name: Advanced Paste
+ Shortcut:
+ - Win: True
+ Ctrl: False
+ Alt: False
+ Shift: False
+ Keys:
+ - 86
+ Description: Open Advanced Paste window
+ - Name: Advanced Paste
+ Shortcut:
+ - Win: True
+ Ctrl: True
+ Alt: True
+ Shift: False
+ Keys:
+ - 86
+ Description: Paste as plain text directly
+
+```
+
+
+### 3.2 `index.yaml` file
+
+The `index.yaml` file is a file that contains all the information about the different manifest files that are saved in the same directory. This file is only available locally and is not saved in the WinGet repository as it is specific to the user.
+
+```yaml
+DefaultShellName: # The package identifier of the default shell used in Windows
+Index: # List of all manifest files
+ - WindowFilter: # The filter of window processes to which the shortcuts apply to
+ BackgroundProcess: # Optionally allows applying WindowFilter to background processes
+ Apps: # List of all manifest files for the filter
+```
+
+
+ DefaultShellName - The package identifier of the default shell used in Windows
+
+ This declares the package identifier of the default shell used in Windows. Most commonly it is `+WindowsNT.Shell`. Although not enforced, only the shell declared in the registry key `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell` should be used here.
+
+
+
+
+ Index - List of all manifest files
+
+
+
+ WindowFilter - The filter of window processes to which the shortcuts apply to
+
+ See the `WindowFilter` field in the manifest file for more information.
+
+
+
+
+ BackgroundProcess - Optionally allows applying WindowFilter to background processes
+
+ **Optional field**
+
+ See the `BackgroundProcess` field in the manifest file for more information.
+
+
+
+
+ Apps - List of all the package identifiers applying for the filter
+
+
+#### 3.2.1 Example
+
+```yaml
+DefaultShellName: "+WindowsNT.Shell"
+Index:
+ - Filter: "*"
+ BackgroundProcess: True
+ Apps: ["+WindowsNT.Shell", "Microsoft.PowerToys"]
+ - Filter: "explorer.exe"
+ Apps: ["+WindowsNT.WindowsExplorer"]
+ - Filter: "taskmgr.exe"
+ Apps: ["+WindowsNT.TaskManager"]
+ - Filter: "msedge.exe"
+ Apps: ["+WindowsNT.Edge"]
+```
diff --git a/installer/PowerToysSetupVNext/ShortcutGuide.wxs b/installer/PowerToysSetupVNext/ShortcutGuide.wxs
index 37b1c7800b01..262ddd267c3c 100644
--- a/installer/PowerToysSetupVNext/ShortcutGuide.wxs
+++ b/installer/PowerToysSetupVNext/ShortcutGuide.wxs
@@ -2,26 +2,25 @@
-
-
+
+
-
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
diff --git a/installer/PowerToysSetupVNext/generateAllFileComponents.ps1 b/installer/PowerToysSetupVNext/generateAllFileComponents.ps1
index 81445753690c..483048ee2e5f 100644
--- a/installer/PowerToysSetupVNext/generateAllFileComponents.ps1
+++ b/installer/PowerToysSetupVNext/generateAllFileComponents.ps1
@@ -323,8 +323,8 @@ Generate-FileComponents -fileListName "ValueGeneratorImagesCmpFiles" -wxsFilePat
## Plugins
#ShortcutGuide
-Generate-FileList -fileDepsJson "" -fileListName ShortcutGuideSvgFiles -wxsFilePath $PSScriptRoot\ShortcutGuide.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\Assets\ShortcutGuide\"
-Generate-FileComponents -fileListName "ShortcutGuideSvgFiles" -wxsFilePath $PSScriptRoot\ShortcutGuide.wxs
+Generate-FileList -fileDepsJson "" -fileListName ShortcutGuideAssetsFiles -wxsFilePath $PSScriptRoot\ShortcutGuide.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\ShortcutGuide\"
+Generate-FileComponents -fileListName "ShortcutGuideAssetsFiles" -wxsFilePath $PSScriptRoot\ShortcutGuide.wxs -regroot $registryroot
#Settings
Generate-FileList -fileDepsJson "" -fileListName SettingsV2AssetsFiles -wxsFilePath $PSScriptRoot\Settings.wxs -depsPath "$PSScriptRoot..\..\..\$platform\Release\WinUI3Apps\Assets\Settings\"
diff --git a/src/common/interop/PowerToys.Interop.vcxproj b/src/common/interop/PowerToys.Interop.vcxproj
index 0c0727afa216..f152b44899e4 100644
--- a/src/common/interop/PowerToys.Interop.vcxproj
+++ b/src/common/interop/PowerToys.Interop.vcxproj
@@ -41,7 +41,6 @@
DynamicLibrary
-
Unicode
false
@@ -100,6 +99,7 @@
KeyboardListener.idl
+
HotkeyManager.idl
@@ -114,6 +114,7 @@
+
TwoWayPipeMessageIPCManaged.idl
@@ -127,6 +128,7 @@
KeyboardListener.idl
+
HotkeyManager.idl
@@ -140,6 +142,7 @@
Create
+
TwoWayPipeMessageIPCManaged.idl
@@ -165,6 +168,9 @@
+
+ {6955446d-23f7-4023-9bb3-8657f904af99}
+
{cc6e41ac-8174-4e8a-8d22-85dd7f4851df}
diff --git a/src/common/interop/PowerToys.Interop.vcxproj.filters b/src/common/interop/PowerToys.Interop.vcxproj.filters
index 6fa51a327571..9a2b3edb6fe6 100644
--- a/src/common/interop/PowerToys.Interop.vcxproj.filters
+++ b/src/common/interop/PowerToys.Interop.vcxproj.filters
@@ -54,6 +54,12 @@
Header Files
+
+ Header Files
+
+
+ Header Files
+
@@ -83,6 +89,12 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
diff --git a/src/common/interop/excluded_app.cpp b/src/common/interop/excluded_app.cpp
new file mode 100644
index 000000000000..bdffe5fed29f
--- /dev/null
+++ b/src/common/interop/excluded_app.cpp
@@ -0,0 +1,39 @@
+#include "pch.h"
+#include "excluded_app.h"
+#include <../utils/string_utils.h>
+
+extern "C"
+{
+ __declspec(dllexport) bool IsCurrentWindowExcludedFromShortcutGuide()
+ {
+ PowerToysSettings::PowerToyValues settings = PowerToysSettings::PowerToyValues::load_from_settings_file(L"Shortcut Guide");
+ auto settingsObject = settings.get_raw_json();
+ std::wstring apps = settingsObject.GetNamedObject(L"properties").GetNamedObject(L"disabled_apps").GetNamedString(L"value").c_str();
+ auto excludedUppercase = apps;
+ CharUpperBuffW(excludedUppercase.data(), static_cast(excludedUppercase.length()));
+ std::wstring_view view(excludedUppercase);
+ view = left_trim(trim(view));
+
+ while (!view.empty())
+ {
+ auto pos = (std::min)(view.find_first_of(L"\r\n"), view.length());
+ m_excludedApps.emplace_back(view.substr(0, pos));
+ view.remove_prefix(pos);
+ view = left_trim(trim(view));
+ }
+
+ if (m_excludedApps.empty())
+ {
+ return false;
+ }
+
+ if (HWND foregroundApp{ GetForegroundWindow() })
+ {
+ auto processPath = get_process_path(foregroundApp);
+ CharUpperBuffW(processPath.data(), static_cast(processPath.length()));
+
+ return check_excluded_app(foregroundApp, processPath, m_excludedApps);
+ }
+ return false;
+ }
+}
diff --git a/src/common/interop/excluded_app.h b/src/common/interop/excluded_app.h
new file mode 100644
index 000000000000..652449a138a1
--- /dev/null
+++ b/src/common/interop/excluded_app.h
@@ -0,0 +1,7 @@
+#pragma once
+
+extern "C"
+{
+ std::vector m_excludedApps;
+ __declspec(dllexport) bool IsCurrentWindowExcludedFromShortcutGuide();
+}
diff --git a/src/common/interop/pch.h b/src/common/interop/pch.h
index c4835a98e1ca..7b06662237e8 100644
--- a/src/common/interop/pch.h
+++ b/src/common/interop/pch.h
@@ -12,3 +12,29 @@
#include
#include
#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include <../SettingsAPI/settings_objects.h>
diff --git a/src/common/interop/tasklist_positions.cpp b/src/common/interop/tasklist_positions.cpp
new file mode 100644
index 000000000000..b650535e950a
--- /dev/null
+++ b/src/common/interop/tasklist_positions.cpp
@@ -0,0 +1,242 @@
+#include "pch.h"
+#include "tasklist_positions.h"
+
+// Tried my hardest adapting this to C#, but FindWindowW didn't work properly in C#. ~Noraa Junker
+
+extern "C"
+{
+ HWND GetTaskbarHwndForCursorMonitor(HMONITOR monitor)
+ {
+ POINT pt;
+ if (!GetCursorPos(&pt))
+ return nullptr;
+
+ // Find the primary taskbar
+ HWND primaryTaskbar = FindWindowW(L"Shell_TrayWnd", nullptr);
+ if (primaryTaskbar)
+ {
+ MONITORINFO mi = { sizeof(mi) };
+ if (GetWindowRect(primaryTaskbar, &mi.rcMonitor))
+ {
+ HMONITOR primaryMonitor = MonitorFromRect(&mi.rcMonitor, MONITOR_DEFAULTTONEAREST);
+ if (primaryMonitor == monitor)
+ return primaryTaskbar;
+ }
+ }
+
+ // Find the secondary taskbar(s)
+ HWND secondaryTaskbar = nullptr;
+ while ((secondaryTaskbar = FindWindowExW(nullptr, secondaryTaskbar, L"Shell_SecondaryTrayWnd", nullptr)) != nullptr)
+ {
+ MONITORINFO mi = { sizeof(mi) };
+ RECT rc;
+ if (GetWindowRect(secondaryTaskbar, &rc))
+ {
+ HMONITOR taskbarMonitor = MonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST);
+ if (monitor == taskbarMonitor)
+ return secondaryTaskbar;
+ }
+ }
+
+ return nullptr;
+ }
+
+ void update(HMONITOR monitor)
+ {
+ // Get HWND of the tasklist for the monitor under the cursor
+ auto taskbar_hwnd = GetTaskbarHwndForCursorMonitor(monitor);
+ if (!taskbar_hwnd)
+ return;
+
+ wchar_t class_name[64] = {};
+ GetClassNameW(taskbar_hwnd, class_name, 64);
+
+ HWND tasklist_hwnd = nullptr;
+
+ if (wcscmp(class_name, L"Shell_TrayWnd") == 0)
+ {
+ // Primary taskbar structure
+ tasklist_hwnd = FindWindowExW(taskbar_hwnd, 0, L"ReBarWindow32", nullptr);
+ if (!tasklist_hwnd)
+ return;
+ tasklist_hwnd = FindWindowExW(tasklist_hwnd, 0, L"MSTaskSwWClass", nullptr);
+ if (!tasklist_hwnd)
+ return;
+ tasklist_hwnd = FindWindowExW(tasklist_hwnd, 0, L"MSTaskListWClass", nullptr);
+ if (!tasklist_hwnd)
+ return;
+ }
+ else if (wcscmp(class_name, L"Shell_SecondaryTrayWnd") == 0)
+ {
+ // Secondary taskbar structure
+ HWND worker_hwnd = FindWindowExW(taskbar_hwnd, 0, L"WorkerW", nullptr);
+ if (!worker_hwnd)
+ return;
+ tasklist_hwnd = FindWindowExW(worker_hwnd, 0, L"MSTaskListWClass", nullptr);
+ if (!tasklist_hwnd)
+ return;
+ }
+ else
+ {
+ // Unknown taskbar type
+ return;
+ }
+
+ if (!automation)
+ {
+ winrt::check_hresult(CoCreateInstance(CLSID_CUIAutomation,
+ nullptr,
+ CLSCTX_INPROC_SERVER,
+ IID_IUIAutomation,
+ automation.put_void()));
+ winrt::check_hresult(automation->CreateTrueCondition(true_condition.put()));
+ }
+ element = nullptr;
+ winrt::check_hresult(automation->ElementFromHandle(tasklist_hwnd, element.put()));
+ }
+
+ void update_new(HMONITOR monitor)
+ {
+ // Get HWND of the tasklist for the monitor under the cursor
+ auto taskbar_hwnd = GetTaskbarHwndForCursorMonitor(monitor);
+ if (!taskbar_hwnd)
+ return;
+
+ wchar_t class_name[64] = {};
+ GetClassNameW(taskbar_hwnd, class_name, 64);
+
+ HWND tasklist_hwnd = nullptr;
+
+ if (wcscmp(class_name, L"Shell_TrayWnd") == 0 || wcscmp(class_name, L"Shell_SecondaryTrayWnd") == 0)
+ {
+ // Primary taskbar structure
+ tasklist_hwnd = FindWindowExW(taskbar_hwnd, 0, L"Windows.UI.Composition.DesktopWindowContentBridge", nullptr);
+ if (!tasklist_hwnd)
+ return;
+ tasklist_hwnd = FindWindowExW(tasklist_hwnd, 0, L"Windows.UI.Input.InputSite.WindowClass", nullptr);
+ if (!tasklist_hwnd)
+ return;
+ }
+ else
+ {
+ // Unknown taskbar type
+ return;
+ }
+
+ if (!automation)
+ {
+ winrt::check_hresult(CoCreateInstance(CLSID_CUIAutomation,
+ nullptr,
+ CLSCTX_INPROC_SERVER,
+ IID_IUIAutomation,
+ automation.put_void()));
+ winrt::check_hresult(automation->CreateTrueCondition(true_condition.put()));
+ }
+
+ winrt::com_ptr tempElement;
+ element = nullptr;
+ winrt::check_hresult(automation->ElementFromHandle(tasklist_hwnd, tempElement.put()));
+
+ winrt::check_hresult(
+ tempElement->FindFirst(TreeScope_Children, true_condition.get(), element.put()));
+ }
+
+ bool update_buttons(std::vector& buttons)
+ {
+ if (!automation || !element)
+ {
+ return false;
+ }
+ winrt::com_ptr elements;
+ if (element->FindAll(TreeScope_Children, true_condition.get(), elements.put()) < 0)
+ return false;
+ if (!elements)
+ return false;
+ int count;
+ if (elements->get_Length(&count) < 0)
+ return false;
+ winrt::com_ptr child;
+ std::vector found_buttons;
+ found_buttons.reserve(count);
+ for (int i = 0; i < count; ++i)
+ {
+ child = nullptr;
+ if (elements->GetElement(i, child.put()) < 0)
+ return false;
+ TasklistButton button = {};
+ if (VARIANT var_rect; child->GetCurrentPropertyValue(UIA_BoundingRectanglePropertyId, &var_rect) >= 0)
+ {
+ if (var_rect.vt == (VT_R8 | VT_ARRAY))
+ {
+ LONG pos;
+ double value;
+ pos = 0;
+ SafeArrayGetElement(var_rect.parray, &pos, &value);
+ button.x = static_cast(value);
+ pos = 1;
+ SafeArrayGetElement(var_rect.parray, &pos, &value);
+ button.y = static_cast(value);
+ pos = 2;
+ SafeArrayGetElement(var_rect.parray, &pos, &value);
+ button.width = static_cast(value);
+ pos = 3;
+ SafeArrayGetElement(var_rect.parray, &pos, &value);
+ button.height = static_cast(value);
+ }
+ VariantClear(&var_rect);
+ }
+ else
+ {
+ return false;
+ }
+ if (BSTR automation_id; child->get_CurrentAutomationId(&automation_id) >= 0)
+ {
+ wcsncpy_s(button.name, automation_id, _countof(button.name));
+ SysFreeString(automation_id);
+ if (wcsncmp(button.name, L"Appid:", wcslen(L"Appid:")) != 0)
+ {
+ continue;
+ }
+ }
+ found_buttons.push_back(button);
+ }
+ // assign keynums
+ buttons.clear();
+ for (auto& button : found_buttons)
+ {
+ if (buttons.empty())
+ {
+ button.keynum = 1;
+ buttons.push_back(std::move(button));
+ }
+ else
+ {
+ if (button.x < buttons.back().x || button.y < buttons.back().y) // skip 2nd row
+ break;
+ if (wcsncmp(button.name, buttons.back().name, _countof(button.name)) == 0)
+ continue; // skip buttons from the same app
+ button.keynum = buttons.back().keynum + 1;
+ buttons.push_back(std::move(button));
+ if (buttons.back().keynum == 10)
+ break; // no more than 10 buttons
+ }
+ }
+ return true;
+ }
+
+ __declspec(dllexport) TasklistButton* get_buttons(HMONITOR monitor, int* size)
+ {
+ update(monitor);
+ static std::vector buttons;
+ update_buttons(buttons);
+ *size = static_cast(buttons.size());
+ if (*size == 0)
+ {
+ // After a certain Windows update, the old method stopped working, try the new one
+ update_new(monitor);
+ update_buttons(buttons);
+ *size = static_cast(buttons.size());
+ }
+ return buttons.data();
+ }
+}
\ No newline at end of file
diff --git a/src/common/interop/tasklist_positions.h b/src/common/interop/tasklist_positions.h
new file mode 100644
index 000000000000..0f8c4ca35aa4
--- /dev/null
+++ b/src/common/interop/tasklist_positions.h
@@ -0,0 +1,23 @@
+#pragma once
+
+struct TasklistButton
+{
+ wchar_t name[256];
+ int x;
+ int y;
+ int width;
+ int height;
+ int keynum;
+};
+
+extern "C"
+{
+ winrt::com_ptr automation;
+ winrt::com_ptr element;
+ winrt::com_ptr true_condition;
+
+ // Helper to get the taskbar HWND for the monitor under the cursor
+ HWND GetTaskbarHwndForCursorMonitor(HMONITOR monitor);
+ bool update_buttons(std::vector& buttons);
+ __declspec(dllexport) TasklistButton* get_buttons(HMONITOR monitor, int* size);
+}
diff --git a/src/modules/ShortcutGuide/ShortcutGuide.IndexYmlGenerator/IndexYmlGenerator.cs b/src/modules/ShortcutGuide/ShortcutGuide.IndexYmlGenerator/IndexYmlGenerator.cs
new file mode 100644
index 000000000000..597ead2ba2ca
--- /dev/null
+++ b/src/modules/ShortcutGuide/ShortcutGuide.IndexYmlGenerator/IndexYmlGenerator.cs
@@ -0,0 +1,76 @@
+// 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.
+
+using System.Collections.Generic;
+using System.IO;
+using ShortcutGuide.Helpers;
+using ShortcutGuide.Models;
+using YamlDotNet.Serialization;
+
+// This class should be moved to WinGet in the future
+namespace ShortcutGuide.IndexYmlGenerator
+{
+ public class IndexYmlGenerator
+ {
+ public static void Main()
+ {
+ CreateIndexYmlFile();
+ }
+
+ // Todo: Exception handling
+ public static void CreateIndexYmlFile()
+ {
+ string path = ManifestInterpreter.PathOfManifestFiles;
+ if (File.Exists(Path.Combine(path, "index.yml")))
+ {
+ File.Delete(Path.Combine(path, "index.yml"));
+ }
+
+ IndexFile indexFile = new() { };
+ Dictionary<(string WindowFilter, bool BackgroundProcess), List> processes = [];
+
+ foreach (string file in Directory.EnumerateFiles(path, "*.yml"))
+ {
+ string content = File.ReadAllText(file);
+ Deserializer deserializer = new();
+ ShortcutFile shortcutFile = deserializer.Deserialize(content);
+ if (processes.TryGetValue((shortcutFile.WindowFilter, shortcutFile.BackgroundProcess), out List? apps))
+ {
+ if (apps.Contains(shortcutFile.PackageName))
+ {
+ continue;
+ }
+
+ apps.Add(shortcutFile.PackageName);
+ continue;
+ }
+
+ processes[(shortcutFile.WindowFilter, shortcutFile.BackgroundProcess)] = [shortcutFile.PackageName];
+ }
+
+ indexFile.Index = [];
+
+ foreach (var item in processes)
+ {
+ indexFile.Index =
+ [
+ .. indexFile.Index,
+ new IndexFile.IndexItem
+ {
+ WindowFilter = item.Key.WindowFilter,
+ BackgroundProcess = item.Key.BackgroundProcess,
+ Apps = [.. item.Value],
+ },
+ ];
+ }
+
+ // Todo: Take the default shell name from the settings or environment variable, default to "+WindowsNT.Shell"
+ indexFile.DefaultShellName = "+WindowsNT.Shell";
+
+ Serializer serializer = new();
+ string yamlContent = serializer.Serialize(indexFile);
+ File.WriteAllText(Path.Combine(path, "index.yml"), yamlContent);
+ }
+ }
+}
diff --git a/src/modules/ShortcutGuide/ShortcutGuide.IndexYmlGenerator/ShortcutGuide.IndexYmlGenerator.csproj b/src/modules/ShortcutGuide/ShortcutGuide.IndexYmlGenerator/ShortcutGuide.IndexYmlGenerator.csproj
new file mode 100644
index 000000000000..571ca9de0363
--- /dev/null
+++ b/src/modules/ShortcutGuide/ShortcutGuide.IndexYmlGenerator/ShortcutGuide.IndexYmlGenerator.csproj
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+ WinExe
+ ShortcutGuide.IndexYmlGenerator
+ enable
+ false
+ false
+ ..\..\..\..\$(Platform)\$(Configuration)\WinUI3Apps
+ PowerToys.ShortcutGuide.IndexYmlGenerator
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/+WindowsNT.Notepad.en-US.yml b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/+WindowsNT.Notepad.en-US.yml
new file mode 100644
index 000000000000..d0d607253c36
--- /dev/null
+++ b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/+WindowsNT.Notepad.en-US.yml
@@ -0,0 +1,247 @@
+PackageName: +WindowsNT.Notepad
+Name: Notepad
+WindowFilter: "Notepad.exe"
+BackgroundProcess: false
+Shortcuts:
+ - SectionName: File
+ Properties:
+ - Name: New tab
+ Recommended: true
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - N
+ - Name: New window
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: true
+ Alt: false
+ Keys:
+ - N
+ - Name: Open
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - O
+ - Name: Save
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - S
+ - Name: Save As
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: true
+ Alt: false
+ Keys:
+ - S
+ - Name: Save all
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: true
+ Keys:
+ - S
+ - Name: Print
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - P
+ - Name: Close tab
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - W
+ - Name: Close window
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: true
+ Alt: false
+ Keys:
+ - W
+ - SectionName: Edit
+ Properties:
+ - Name: Undo
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - Z
+ - Name: Redo
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: true
+ Keys:
+ - Z
+ - Name: Cut
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - X
+ - Name: Copy
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - C
+ - Name: Paste
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - V
+ - Name: Search with Bing
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - E
+ - Name: Find
+ Recommended: true
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - F
+ - Name: Find next
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - F3
+ - Name: Find previous
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: true
+ Alt: false
+ Keys:
+ - F3
+ - Name: Replace
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - H
+ - Name: Go to
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - G
+ - Name: Select all
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - A
+ - Name: Time/Date
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - F5
+ - SectionName: View
+ Properties:
+ - Name: Zoom in
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - Plus
+ - Name: Zoom out
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - Minus
+ - Name: Reset zoom
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - 0
+ - SectionName: Formatting
+ Properties:
+ - Name: Bold
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - B
+ - Name: Italic
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - I
+ - Name: Insert link
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - K
+ - Name: Clear formatting
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - Space
\ No newline at end of file
diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/+WindowsNT.Shell.en-US.yml b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/+WindowsNT.Shell.en-US.yml
new file mode 100644
index 000000000000..de9eb03ab10c
--- /dev/null
+++ b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/+WindowsNT.Shell.en-US.yml
@@ -0,0 +1,773 @@
+PackageName: +WindowsNT.Shell
+WindowFilter: "*"
+BackgroundProcess: true
+Shortcuts:
+ - SectionName: Desktop Shortcuts
+ Properties:
+ - Name: Close active window
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - F4
+ - Name: Open shutdown box
+ Description: When no windows are open
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - F4
+ - Name: Cycle through open Windows
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - Esc
+ - Name: Reveal typed password
+ Description: On sign-in screen
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - F8
+ - Name: Go back
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - ""
+ - Name: Go forward
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - ""
+ - Name: Move up one screen
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - ""
+ - Name: Move down one screen
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - ""
+ - Name: Window context menu
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - Space
+ - Name: Switch between open apps
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - Tab
+ Description: While pressing Tab multiple times
+ - Name: Run command
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - ""
+ Description: for the underlined letter in the app
+ - Name: View open apps
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: true
+ Keys:
+ - Tab
+ - Name: Change start menu size
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - Name: Move cursor
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ Description: To the beginning or end of a word
+ - Name: Switch keyboard layout
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: true
+ Alt: false
+ Keys:
+ - ""
+ - Name: Select block of text
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: true
+ Alt: false
+ Keys:
+ - ""
+ - Name: Open Task Manager
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: true
+ Alt: false
+ Keys:
+ - Esc
+ - Name: Enable/Disable Chinese IME
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - Space
+ - Name: Open context menu
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: true
+ Alt: false
+ Keys:
+ - F10
+ Description: For the selected item
+ - SectionName: Virtual desktop
+ Properties:
+ - Name: Open task view
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - Tab
+ - Name: Add a virtual desktop
+ Shortcut:
+ - Win: true
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - D
+ - Name: Close current desktop
+ Shortcut:
+ - Win: true
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - F4
+ - Name: Switch desktop
+ Shortcut:
+ - Win: true
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ Recommended: true
+ - SectionName: "Windows key"
+ Properties:
+ - Name: Open start menu
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - Name: Open Action Center
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "A"
+ - Name: Open Date and Time
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - "D"
+ - Name: Focus on the notification area
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "B"
+ - Name: Open narrator
+ Shortcut:
+ - Win: true
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "Enter"
+ - Name: Open domain search
+ Shortcut:
+ - Win: true
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "F"
+ - Name: Open Quick Assist
+ Shortcut:
+ - Win: true
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "Q"
+ - Name: Wake up device
+ Shortcut:
+ - Win: true
+ Ctrl: true
+ Shift: true
+ Alt: false
+ Keys:
+ - "B"
+ Description: When black or a blank screen.
+ - Name: Change input option
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "Space"
+ Description: To next option
+ - Name: Change input option
+ Shortcut:
+ - Win: true
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "Space"
+ Description: To previous option
+ - Name: Display/Hide desktop
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "D"
+ - Name: Minimize the active window
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "Down"
+ Recommended: true
+ - Name: Open file Explorer
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "E"
+ - Name: Close Magnifier
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "Esc"
+ - Name: Open Feedback Hub
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "F"
+ Recommended: true
+ - Name: Start IME reconversion
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "/"
+ - Name: Open Game Bar
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "G"
+ - Name: Open voice dictation
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "H"
+ - Name: Minimize or restore all other windows
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - Name: Open Settings
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "I"
+ - Name: Set focus to a Windows tip
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "J"
+ - Name: Open Cast
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "K"
+ - Name: Lock the device
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "L"
+ - Name: Snap the window
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - Name: Minimize all windows
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "M"
+ - Name: Zoom out Magnifier
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "-"
+ - Name: Zoom in Magnifier
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "="
+ - Name: Open notification center
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "N"
+ - Name: Lock the device orientation
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "O"
+ - Name: Open project Settings
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "P"
+ - Name: Open Settings about Page
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - Name: Open the emoji panel
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "."
+ - Name: Open the emoji panel
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ";"
+ - Name: Capture a screenshot
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ Description: Save to the pictures folder
+ - Name: Open search
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "Q"
+ - Name: Open search
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "S"
+ - Name: Open Run dialog
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "R"
+ - Name: Restore window
+ Description: If a window is snapped or maximized
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: true
+ Alt: false
+ Keys:
+ - ""
+ - Name: Make UWP app full screen
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: true
+ Alt: false
+ Keys:
+ - ""
+ - Name: Move window to monitor
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: true
+ Alt: false
+ Keys:
+ - ""
+ - Name: Open Snipping Tool
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: true
+ Alt: false
+ Keys:
+ - "S"
+ - Name: Stretch window
+ Description: To the top and bottom of the screen
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: true
+ Alt: false
+ Keys:
+ - ""
+ - Name: Open task view
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "Tab"
+ - Name: Open Accessibility Settings
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "U"
+ - Name: Maximize the active window
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - Name: Open the clipboard history
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "V"
+ - Name: Open widgets
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "W"
+ - Name: Open Quick Link menu
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "X"
+ - Name: Open snap layouts
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "Z"
+ - SectionName: Clipboard
+ Properties:
+ - Name: Copy
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "C"
+ - Name: Cut
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "X"
+ - Name: Paste
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "V"
+ - Name: Paste
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: true
+ Alt: false
+ Keys:
+ - ""
+ Description: Paste as plain text
+ - SectionName: Taskbar Shortcuts
+ Properties:
+ - Name: Open app in Taskbar
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - Name: Open jump list
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - ""
+ - Name: Switch to last active window
+ Shortcut:
+ - Win: true
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - Name: Open as administrator
+ Shortcut:
+ - Win: true
+ Ctrl: true
+ Shift: true
+ Alt: false
+ Keys:
+ - ""
+ - SectionName: Copilot key
+ Properties:
+ - Name: Open Copilot
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ''
+ Description: When copilot is available
+ - Name: Open Windows search
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ''
+ Description: When copilot is not available
+ - SectionName: Office key
+ Properties:
+ - Name: Open Word
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - "W"
+ - Name: Open Excel
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - "X"
+ - Name: Open PowerPoint
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - "P"
+ - Name: Open Outlook
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - "O"
+ - Name: Open Microsoft Teams
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - "T"
+ - Name: Open OneNote
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - "N"
+ - Name: Open OneDrive
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - "D"
+ - Name: Open Yammer
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - "Y"
+ - Name: Open LinkedIn
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - "L"
\ No newline at end of file
diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/+WindowsNT.WindowsExplorer.en-US.yml b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/+WindowsNT.WindowsExplorer.en-US.yml
new file mode 100644
index 000000000000..ca134ea7926d
--- /dev/null
+++ b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/+WindowsNT.WindowsExplorer.en-US.yml
@@ -0,0 +1,266 @@
+PackageName: +WindowsNT.WindowsExplorer
+WindowFilter: "explorer.exe"
+Name: File Explorer
+Shortcuts:
+ - SectionName: General
+ Properties:
+ - Name: Open File Explorer
+ Shortcut:
+ - Win: true
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "E"
+ Recommended: true
+ - Name: Select the address bar
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - "D"
+ - Name: Select the address bar
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "L"
+ - Name: Select the address bar
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "F4"
+ - Name: Select the search box
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "E"
+ - Name: Select the search box
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "F3"
+ - Name: Select the search box
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "F"
+ - Name: Refresh the window
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "F5"
+ - Name: Cycle through elements in the active window
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "F6"
+ - Name: Maximize or restore the active window
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "F11"
+ - SectionName: Navigation
+ Properties:
+ - Name: Navigate to the previous folder
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - ""
+ - Name: Navigate to the previous folder
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - Name: Navigate to the next folder
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - ""
+ - Name: Move up a level in the folder path
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - ""
+ - SectionName: "Window management"
+ Properties:
+ - Name: Open a new window
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "N"
+ - Name: Open a new tab
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "T"
+ Recommended: true
+ - Name: Close the current active tab
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "W"
+ - Name: Move to the next tab
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "Tab"
+ - Name: Move to the previous tab
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: true
+ Alt: false
+ Keys:
+ - "Tab"
+ - Name: Move to that tab number
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "Number (1-9)"
+ - Name: Show/Hide the preview pane
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - "P"
+ - Name: Show/Hide the details pane
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: true
+ Alt: true
+ Keys:
+ - "P"
+ - Name: Resize all columns to fit text
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "+"
+ - Name: Expand all folders
+ Description: In the navigation pane
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: true
+ Alt: false
+ Keys:
+ - "E"
+ - SectionName: "File management"
+ Properties:
+ - Name: Display properties for the selected item
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: true
+ Keys:
+ - "Enter"
+ - Name: Delete the selected item
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+ - Name: Delete the selected item
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "D"
+ - Name: Delete the selected item permanently
+ Description: "This removes the item without sending it to the Recycle Bin"
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - "D"
+ - Name: Create a new folder
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: true
+ Alt: false
+ Keys:
+ - "N"
+ Recommended: true
+ - Name: Rename the selected item
+ Shortcut:
+ - Win: false
+ Ctrl: false
+ Shift: false
+ Alt: false
+ Keys:
+ - "F2"
+ - Name: Select multiple items
+ Shortcut:
+ - Win: false
+ Ctrl: true
+ Shift: false
+ Alt: false
+ Keys:
+ - ""
+
\ No newline at end of file
diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/CopilotKey.png b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/CopilotKey.png
new file mode 100644
index 000000000000..ccb59a6075af
Binary files /dev/null and b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/CopilotKey.png differ
diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/HeroImage-dark.png b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/HeroImage-dark.png
new file mode 100644
index 000000000000..aa1a055744b5
Binary files /dev/null and b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/HeroImage-dark.png differ
diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/HeroImage.png b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/HeroImage.png
new file mode 100644
index 000000000000..54c028ec5467
Binary files /dev/null and b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/HeroImage.png differ
diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/Microsoft.PowerToys.en-US.yml b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/Microsoft.PowerToys.en-US.yml
new file mode 100644
index 000000000000..c768b4bb5ebe
--- /dev/null
+++ b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/Microsoft.PowerToys.en-US.yml
@@ -0,0 +1,9 @@
+PackageName: Microsoft.PowerToys
+Name: PowerToys
+BackgroundProcess: True
+WindowFilter: "powertoys.exe"
+Shortcuts:
+ - SectionName: General
+ Properties:
+#
+#
\ No newline at end of file
diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/OfficeKey.png b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/OfficeKey.png
new file mode 100644
index 000000000000..ab524b1793be
Binary files /dev/null and b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/OfficeKey.png differ
diff --git a/src/modules/ShortcutGuide/ShortcutGuide/Shortcut-Guide.ico b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/ShortcutGuide.ico
similarity index 100%
rename from src/modules/ShortcutGuide/ShortcutGuide/Shortcut-Guide.ico
rename to src/modules/ShortcutGuide/ShortcutGuide.Ui/Assets/ShortcutGuide/ShortcutGuide.ico
diff --git a/src/modules/ShortcutGuide/ShortcutGuide.Ui/Converters/ShortcutDescriptionToKeysConverter.cs b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Converters/ShortcutDescriptionToKeysConverter.cs
new file mode 100644
index 000000000000..4ed93a88efc9
--- /dev/null
+++ b/src/modules/ShortcutGuide/ShortcutGuide.Ui/Converters/ShortcutDescriptionToKeysConverter.cs
@@ -0,0 +1,100 @@
+// 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.
+
+using System;
+using System.Collections.Generic;
+using System.Windows.Documents;
+using ManagedCommon;
+using Microsoft.UI.Xaml.Data;
+using ShortcutGuide.Models;
+using Windows.System;
+
+namespace ShortcutGuide.Converters
+{
+ public sealed partial class ShortcutDescriptionToKeysConverter : IValueConverter
+ {
+ public object Convert(object value, Type targetType, object parameter, string language)
+ {
+ if (value is ShortcutDescription description)
+ {
+ // Populate keysList with the keys from the ShortcutDescription
+ return this.GetKeysList(description);
+ }
+ else
+ {
+ List