Skip to content
Open
Show file tree
Hide file tree
Changes from 58 commits
Commits
Show all changes
126 commits
Select commit Hold shift + click to select a range
03587ae
[WIP] Shortcut Guide V2
noraa-junker Oct 14, 2024
7a6189b
Changed style a little bit
noraa-junker Oct 14, 2024
c81a423
Push
noraa-junker Nov 2, 2024
d5f5500
Push
noraa-junker Nov 3, 2024
22dc870
Code cleanup
noraa-junker Nov 3, 2024
a14c458
Fix display on monitor with mouse and move all NaticeMethods to Nativ…
noraa-junker Nov 3, 2024
da7b789
Fix error messages and read application titles out of index manifest
noraa-junker Nov 10, 2024
6952deb
Rename YmlInterpreter to ManifestInterpreter
noraa-junker Nov 10, 2024
a292a92
Merge main
noraa-junker Jun 6, 2025
b16b457
push
noraa-junker Jun 6, 2025
7ce5182
Add support for multiple shortcuts
noraa-junker Jun 7, 2025
569f072
Add copying keyboard manifests and other improvements
noraa-junker Jun 11, 2025
54d176c
Add keyboard accelerator to the search box
noraa-junker Jun 11, 2025
0b823ea
Handle errors displaying app and close window automatically on focus …
noraa-junker Jun 11, 2025
7596e96
Add taskbar indicators
noraa-junker Jun 13, 2025
46df486
Refactoring and localisation
noraa-junker Jun 15, 2025
da77396
Remove some hosts references and fix close button
noraa-junker Jun 15, 2025
a6b7614
Refactoring
noraa-junker Jun 18, 2025
d73ab4f
Remove old Shortcut Guide
noraa-junker Jul 27, 2025
07760e4
Remove legacy shortcut behaviour
noraa-junker Jul 27, 2025
1580279
Fix closing by shortcut add closing by ESC and fix missing files from…
noraa-junker Jul 27, 2025
ba40989
Merge main in
noraa-junker Jul 27, 2025
3e75fb0
Merge main in
noraa-junker Jul 27, 2025
95e0a20
Merge branch 'feature/shortcutguidev2' of https://github.com/microsof…
noraa-junker Jul 27, 2025
e26bf2a
Merge branch 'feature/shortcutguidev2' of https://github.com/microsof…
noraa-junker Jul 27, 2025
be799dd
Merge branch 'feature/shortcutguidev2' of https://github.com/microsof…
noraa-junker Jul 27, 2025
038cd23
Merge branch 'feature/shortcutguidev2' of https://github.com/microsof…
noraa-junker Jul 27, 2025
eed6dc6
Merge branch 'feature/shortcutguidev2' of https://github.com/microsof…
noraa-junker Jul 27, 2025
3a8431a
Only display powertoys shortcuts if the modules are enabled
noraa-junker Jul 27, 2025
82b0ca7
Fix pinning and unpinning shortcuts
noraa-junker Jul 27, 2025
3475c92
Delete weird file
noraa-junker Jul 27, 2025
fe3d481
Fix spelling
noraa-junker Jul 27, 2025
201a27d
Add taskbar launch shortcuts and make powertoys shortcuts empty by de…
noraa-junker Jul 27, 2025
7e2fc44
Add taskbar launch shortcuts and make powertoys shortcuts empty by de…
noraa-junker Jul 27, 2025
fa54b49
Make settings button work and add settings placeholder
noraa-junker Jul 27, 2025
e3b1ec3
commit
noraa-junker Jul 27, 2025
7e50caa
Add disclaimers
noraa-junker Jul 27, 2025
a306797
Make UI better
noraa-junker Jul 27, 2025
2ee02c4
Fix spelling
noraa-junker Jul 27, 2025
b12fcf6
Localization
noraa-junker Jul 27, 2025
e0e7bf4
Respect theme selection
noraa-junker Jul 27, 2025
0f85f8b
Respect excluded apps
noraa-junker Jul 27, 2025
f9183af
Add welcome screen and update settings and OOBE
noraa-junker Jul 28, 2025
71dd8fe
Add attribution in settings
noraa-junker Jul 28, 2025
56f056e
Add explorer shortcuts, fix animation stopping and add an error when …
noraa-junker Jul 28, 2025
2f89281
Refactoring, commenting and fixing some little lefrover bugs
noraa-junker Jul 28, 2025
1982f26
Add documentation and only export in tasklist_positions what needs to…
noraa-junker Jul 29, 2025
0e2f466
Fix building in release mode and some other stuff
noraa-junker Jul 29, 2025
498c8d5
Fix xaml styling
noraa-junker Jul 29, 2025
273b50c
Fix arm64 configuration
noraa-junker Jul 29, 2025
7e7bb04
So something was not right. Hopefully this fixes it.
noraa-junker Jul 30, 2025
3b77feb
Merge branch 'main' into feature/shortcutguidev2
noraa-junker Jul 30, 2025
3c1a6a5
That is a kinda embarrasing error
noraa-junker Jul 30, 2025
1da76e5
Merge branch 'feature/shortcutguidev2' of https://github.com/microsof…
noraa-junker Jul 30, 2025
2d12932
Remove failing test
noraa-junker Jul 30, 2025
3796fdb
Forgot notice.md and CPPProject has some trouble buildinng release x64
noraa-junker Jul 30, 2025
0b6683e
Make some adjustants to how the windows key is displayed
noraa-junker Aug 1, 2025
77a5bc2
Adress some PR comments and fix some bugs
noraa-junker Aug 1, 2025
7266745
Fix xaml styling
noraa-junker Aug 1, 2025
e116265
Factor out TaskbarIndicator
noraa-junker Aug 3, 2025
a41be80
Fix styling
noraa-junker Aug 3, 2025
6bd5c4c
Change some StaticResources to ThemeResources and change style of tas…
noraa-junker Aug 3, 2025
271e0c0
Change oobe design
noraa-junker Aug 4, 2025
0abae1d
close infotip when link is clicked and remove unneccesairy grid
noraa-junker Aug 4, 2025
d568d16
git messed up
noraa-junker Aug 4, 2025
f42b392
fix xaml styling
noraa-junker Aug 5, 2025
8e7be16
Change display name of File Explorer, hide taskbar indicators on othe…
noraa-junker Aug 7, 2025
69c6475
[WIP] Shortcut Guide V2
noraa-junker Oct 14, 2024
55b3e15
Changed style a little bit
noraa-junker Oct 14, 2024
6558260
Push
noraa-junker Nov 2, 2024
2f4766d
Push
noraa-junker Nov 3, 2024
ddd090c
Code cleanup
noraa-junker Nov 3, 2024
acf510d
Fix display on monitor with mouse and move all NaticeMethods to Nativ…
noraa-junker Nov 3, 2024
440e751
Fix error messages and read application titles out of index manifest
noraa-junker Nov 10, 2024
2b16068
Rename YmlInterpreter to ManifestInterpreter
noraa-junker Nov 10, 2024
6b8a3e6
push
noraa-junker Jun 6, 2025
44d12c6
Add support for multiple shortcuts
noraa-junker Jun 7, 2025
9ecf82d
Add copying keyboard manifests and other improvements
noraa-junker Jun 11, 2025
0a07811
Add keyboard accelerator to the search box
noraa-junker Jun 11, 2025
7acab45
Handle errors displaying app and close window automatically on focus …
noraa-junker Jun 11, 2025
e6edca9
Add taskbar indicators
noraa-junker Jun 13, 2025
3302e61
Refactoring and localisation
noraa-junker Jun 15, 2025
afc27e8
Remove some hosts references and fix close button
noraa-junker Jun 15, 2025
48d8e33
Refactoring
noraa-junker Jun 18, 2025
7dc8c10
Remove old Shortcut Guide
noraa-junker Jul 27, 2025
411f4df
Remove legacy shortcut behaviour
noraa-junker Jul 27, 2025
eff58e1
Fix closing by shortcut add closing by ESC and fix missing files from…
noraa-junker Jul 27, 2025
bff3874
Only display powertoys shortcuts if the modules are enabled
noraa-junker Jul 27, 2025
639b29e
Fix pinning and unpinning shortcuts
noraa-junker Jul 27, 2025
26f7610
Delete weird file
noraa-junker Jul 27, 2025
509ad63
Fix spelling
noraa-junker Jul 27, 2025
0d5c85a
Add taskbar launch shortcuts and make powertoys shortcuts empty by de…
noraa-junker Jul 27, 2025
16c4a56
Make settings button work and add settings placeholder
noraa-junker Jul 27, 2025
e70ca56
Add taskbar launch shortcuts and make powertoys shortcuts empty by de…
noraa-junker Jul 27, 2025
68a10d0
Add disclaimers
noraa-junker Jul 27, 2025
68b7b41
Make UI better
noraa-junker Jul 27, 2025
b1d5233
Fix spelling
noraa-junker Jul 27, 2025
f8cc513
Localization
noraa-junker Jul 27, 2025
2e6f80f
Respect theme selection
noraa-junker Jul 27, 2025
3458d01
Respect excluded apps
noraa-junker Jul 27, 2025
84ab120
Add welcome screen and update settings and OOBE
noraa-junker Jul 28, 2025
145247c
Add attribution in settings
noraa-junker Jul 28, 2025
97cba61
Add explorer shortcuts, fix animation stopping and add an error when …
noraa-junker Jul 28, 2025
84d4cbb
Refactoring, commenting and fixing some little lefrover bugs
noraa-junker Jul 28, 2025
4cb9c53
Add documentation and only export in tasklist_positions what needs to…
noraa-junker Jul 29, 2025
6d7d5f9
Fix building in release mode and some other stuff
noraa-junker Jul 29, 2025
5c11c75
Fix xaml styling
noraa-junker Jul 29, 2025
b553add
Fix arm64 configuration
noraa-junker Jul 29, 2025
387b7e9
So something was not right. Hopefully this fixes it.
noraa-junker Jul 30, 2025
3b7df37
That is a kinda embarrasing error
noraa-junker Jul 30, 2025
ac789a7
Remove failing test
noraa-junker Jul 30, 2025
cd844e3
Forgot notice.md and CPPProject has some trouble buildinng release x64
noraa-junker Jul 30, 2025
dc0877e
Make some adjustants to how the windows key is displayed
noraa-junker Aug 1, 2025
bb16ae1
Adress some PR comments and fix some bugs
noraa-junker Aug 1, 2025
19f9506
Fix xaml styling
noraa-junker Aug 1, 2025
72be095
Factor out TaskbarIndicator
noraa-junker Aug 3, 2025
dceb1d7
Fix styling
noraa-junker Aug 3, 2025
4853bd0
Change some StaticResources to ThemeResources and change style of tas…
noraa-junker Aug 3, 2025
a764bf3
Change oobe design
noraa-junker Aug 4, 2025
0917a64
close infotip when link is clicked and remove unneccesairy grid
noraa-junker Aug 4, 2025
73f718c
git messed up
noraa-junker Aug 4, 2025
e53e1b4
fix xaml styling
noraa-junker Aug 5, 2025
4aff341
Change display name of File Explorer, hide taskbar indicators on othe…
noraa-junker Aug 7, 2025
b9c1181
Add back missing project because of rebase from main:
yeelam-gordon Aug 19, 2025
e7582eb
Add back empty line which is missing during rebase main
yeelam-gordon Aug 19, 2025
200afb5
merge main
noraa-junker Aug 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/actions/spell-check/expect.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1145,6 +1145,7 @@ OUTOFCONTEXT
Outptr
outputtype
outsettings
outsourced
OVERLAPPEDWINDOW
Oversampling
OVERWRITEPROMPT
Expand Down Expand Up @@ -1280,6 +1281,7 @@ projectname
PROPERTYKEY
Propset
PROPVARIANT
Prt
PRTL
prvpane
psapi
Expand Down Expand Up @@ -1918,6 +1920,7 @@ WNDCLASSW
WNDPROC
wnode
wom
workerw
WORKSPACESEDITOR
WORKSPACESLAUNCHER
WORKSPACESSNAPSHOTTOOL
Expand Down
8 changes: 6 additions & 2 deletions .pipelines/ESRPSigning_core.json
Original file line number Diff line number Diff line change
Expand Up @@ -216,8 +216,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",
Expand Down
1 change: 1 addition & 0 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@
<PackageVersion Include="WinUIEx" Version="2.2.0" />
<PackageVersion Include="WPF-UI" Version="3.0.5" />
<PackageVersion Include="WyHash" Version="1.0.5" />
<PackageVersion Include="YamlDotNet" Version="16.3.0" />
</ItemGroup>
<ItemGroup Condition="'$(IsExperimentationLive)'!=''">
<!-- Additional dependencies used by experimentation -->
Expand Down
1 change: 1 addition & 0 deletions NOTICE.md
Original file line number Diff line number Diff line change
Expand Up @@ -1581,3 +1581,4 @@ SOFTWARE.
- WinUIEx 2.2.0
- WPF-UI 3.0.5
- WyHash 1.0.5
- YamlDotNet 16.3.0
47 changes: 35 additions & 12 deletions PowerToys.sln
Original file line number Diff line number Diff line change
Expand Up @@ -328,12 +328,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Community.PowerToys.Run.Plu
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Community.PowerToys.Run.Plugin.UnitConverter.UnitTest", "src\modules\launcher\Plugins\Community.PowerToys.Run.Plugin.UnitConverter.UnitTest\Community.PowerToys.Run.Plugin.UnitConverter.UnitTest.csproj", "{3E424AD2-19E5-4AE6-B833-F53963EB5FC1}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shortcutguide", "shortcutguide", "{106CBECA-0701-4FC3-838C-9DF816A19AE2}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ShortcutGuide", "ShortcutGuide", "{106CBECA-0701-4FC3-838C-9DF816A19AE2}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShortcutGuideModuleInterface", "src\modules\ShortcutGuide\ShortcutGuideModuleInterface\ShortcutGuideModuleInterface.vcxproj", "{2D604C07-51FC-46BB-9EB7-75AECC7F5E81}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShortcutGuide", "src\modules\ShortcutGuide\ShortcutGuide\ShortcutGuide.vcxproj", "{2EDB3EB4-FA92-4BFF-B2D8-566584837231}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FancyZonesModuleInterface", "src\modules\fancyzones\FancyZonesModuleInterface\FancyZonesModuleInterface.vcxproj", "{48804216-2A0E-4168-A6D8-9CD068D14227}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FancyZones", "src\modules\fancyzones\FancyZones\FancyZones.vcxproj", "{FF1D7936-842A-4BBB-8BEA-E9FE796DE700}"
Expand Down Expand Up @@ -788,6 +786,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.Window
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.UnitTestBase", "src\modules\cmdpal\Tests\Microsoft.CmdPal.Ext.UnitTestsBase\Microsoft.CmdPal.Ext.UnitTestBase.csproj", "{00D8659C-2068-40B6-8B86-759CD6284BBB}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShortcutGuide.CPPProject", "src\modules\ShortcutGuide\ShortcutGuide.CPPProject\ShortcutGuide.CPPProject.vcxproj", "{C992FD2C-83B8-4941-9FC1-09730068D8EC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShortcutGuide.IndexYmlGenerator", "src\modules\ShortcutGuide\ShortcutGuide.IndexYmlGenerator\ShortcutGuide.IndexYmlGenerator.csproj", "{30F57201-9B54-5253-8033-8A28ECD3F1CE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ShortcutGuide.Ui", "src\modules\ShortcutGuide\ShortcutGuide.Ui\ShortcutGuide.Ui.csproj", "{D5BD72DD-B461-FDD4-FD7D-AF0B620AE75D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|ARM64 = Debug|ARM64
Expand Down Expand Up @@ -1428,14 +1432,6 @@ Global
{2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Release|ARM64.Build.0 = Release|ARM64
{2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Release|x64.ActiveCfg = Release|x64
{2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Release|x64.Build.0 = Release|x64
{2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Debug|ARM64.ActiveCfg = Debug|ARM64
{2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Debug|ARM64.Build.0 = Debug|ARM64
{2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Debug|x64.ActiveCfg = Debug|x64
{2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Debug|x64.Build.0 = Debug|x64
{2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Release|ARM64.ActiveCfg = Release|ARM64
{2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Release|ARM64.Build.0 = Release|ARM64
{2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Release|x64.ActiveCfg = Release|x64
{2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Release|x64.Build.0 = Release|x64
{48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|ARM64.ActiveCfg = Debug|ARM64
{48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|ARM64.Build.0 = Debug|ARM64
{48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|x64.ActiveCfg = Debug|x64
Expand Down Expand Up @@ -2850,6 +2846,30 @@ Global
{00D8659C-2068-40B6-8B86-759CD6284BBB}.Release|ARM64.Build.0 = Release|ARM64
{00D8659C-2068-40B6-8B86-759CD6284BBB}.Release|x64.ActiveCfg = Release|x64
{00D8659C-2068-40B6-8B86-759CD6284BBB}.Release|x64.Build.0 = Release|x64
{C992FD2C-83B8-4941-9FC1-09730068D8EC}.Debug|ARM64.ActiveCfg = Debug|ARM64
{C992FD2C-83B8-4941-9FC1-09730068D8EC}.Debug|ARM64.Build.0 = Debug|ARM64
{C992FD2C-83B8-4941-9FC1-09730068D8EC}.Debug|x64.ActiveCfg = Debug|x64
{C992FD2C-83B8-4941-9FC1-09730068D8EC}.Debug|x64.Build.0 = Debug|x64
{C992FD2C-83B8-4941-9FC1-09730068D8EC}.Release|ARM64.ActiveCfg = Release|ARM64
{C992FD2C-83B8-4941-9FC1-09730068D8EC}.Release|ARM64.Build.0 = Release|ARM64
{C992FD2C-83B8-4941-9FC1-09730068D8EC}.Release|x64.ActiveCfg = Release|x64
{C992FD2C-83B8-4941-9FC1-09730068D8EC}.Release|x64.Build.0 = Release|x64
{30F57201-9B54-5253-8033-8A28ECD3F1CE}.Debug|ARM64.ActiveCfg = Debug|ARM64
{30F57201-9B54-5253-8033-8A28ECD3F1CE}.Debug|ARM64.Build.0 = Debug|ARM64
{30F57201-9B54-5253-8033-8A28ECD3F1CE}.Debug|x64.ActiveCfg = Debug|x64
{30F57201-9B54-5253-8033-8A28ECD3F1CE}.Debug|x64.Build.0 = Debug|x64
{30F57201-9B54-5253-8033-8A28ECD3F1CE}.Release|ARM64.ActiveCfg = Release|ARM64
{30F57201-9B54-5253-8033-8A28ECD3F1CE}.Release|ARM64.Build.0 = Release|ARM64
{30F57201-9B54-5253-8033-8A28ECD3F1CE}.Release|x64.ActiveCfg = Release|x64
{30F57201-9B54-5253-8033-8A28ECD3F1CE}.Release|x64.Build.0 = Release|x64
{D5BD72DD-B461-FDD4-FD7D-AF0B620AE75D}.Debug|ARM64.ActiveCfg = Debug|ARM64
{D5BD72DD-B461-FDD4-FD7D-AF0B620AE75D}.Debug|ARM64.Build.0 = Debug|ARM64
{D5BD72DD-B461-FDD4-FD7D-AF0B620AE75D}.Debug|x64.ActiveCfg = Debug|x64
{D5BD72DD-B461-FDD4-FD7D-AF0B620AE75D}.Debug|x64.Build.0 = Debug|x64
{D5BD72DD-B461-FDD4-FD7D-AF0B620AE75D}.Release|ARM64.ActiveCfg = Release|ARM64
{D5BD72DD-B461-FDD4-FD7D-AF0B620AE75D}.Release|ARM64.Build.0 = Release|ARM64
{D5BD72DD-B461-FDD4-FD7D-AF0B620AE75D}.Release|x64.ActiveCfg = Release|x64
{D5BD72DD-B461-FDD4-FD7D-AF0B620AE75D}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -3161,8 +3181,11 @@ Global
{E816D7AF-4688-4ECB-97CC-3D8E798F3828} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{E816D7B0-4688-4ECB-97CC-3D8E798F3829} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{00D8659C-2068-40B6-8B86-759CD6284BBB} = {8EF25507-2575-4ADE-BF7E-D23376903AB8}
{C992FD2C-83B8-4941-9FC1-09730068D8EC} = {106CBECA-0701-4FC3-838C-9DF816A19AE2}
{30F57201-9B54-5253-8033-8A28ECD3F1CE} = {106CBECA-0701-4FC3-838C-9DF816A19AE2}
{D5BD72DD-B461-FDD4-FD7D-AF0B620AE75D} = {106CBECA-0701-4FC3-838C-9DF816A19AE2}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0}
EndGlobalSection
EndGlobal
EndGlobal
Binary file removed doc/devdocs/images/shortcutguide/diagram.png
Binary file not shown.
104 changes: 61 additions & 43 deletions doc/devdocs/modules/shortcut_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -25,67 +27,83 @@ 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.

### [`ShortcutGuide.CPPProject`](/src/modules/ShortcutGuide/ShortcutGuide.CPPProject/ShortcutGuide.CPPProject.vcxproj)

This project exports certain functions to be used by the Shortcut Guide module, that were not able to be implemented in C#.

#### [`excluded_app.cpp`](/src/modules/ShortcutGuide/ShortcutGuide.CPPProject/excluded_app.cpp)

This file contains one function with the following signature:

![Diagram](../images/shortcutguide/diagram.png)
```cpp
__declspec(dllexport) bool IsCurrentWindowExcludedFromShortcutGuide()
```

### Core Files
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`.

#### [`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.
#### [`tasklist_positions.cpp`](/src/modules/ShortcutGuide/ShortcutGuide.CPPProject/tasklist_positions.cpp)

#### [`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 file contains helper functions to retrieve the positions of the taskbar buttons. It exports the following function:

#### [`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
```cpp
__declspec(dllexport) TasklistButton* get_buttons(HMONITOR monitor, int* size)
```

#### [`keyboard_state.cpp`](/src/modules/shortcut_guide/keyboard_state.cpp)
Contains helper methods for checking the current state of the keyboard.
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.

#### [`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.
`monitor` must be the monitor handle of the monitor containing the taskbar instance of which the buttons should be retrieved.

#### [`trace.cpp`](/src/modules/shortcut_guide/trace.cpp)
Contains code for telemetry.
`size` will contain the resulting array size.

### Supporting Files
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"

#### [`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.
For any secondary taskbar it searches for:
* A window called "Shell_SecondaryTrayWnd"
* that contains a window called "WorkerW"
* that contains a window called "MSTaskListWClass"

#### [`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 "MSTaskListWClass" while skipping such with a same name (which implies the user does not use combining taskbar buttons)

#### [`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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you mean in the future, there will be really like "+WindowsNT.Shell" avaliable in winget, and it can also define the localized Shortcut information there?

- Adding localization support for the built-in manifest files
17 changes: 8 additions & 9 deletions installer/PowerToysSetup/ShortcutGuide.wxs
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,25 @@

<?include $(sys.CURRENTDIR)\Common.wxi?>

<?define ShortcutGuideSvgFiles=?>
<?define ShortcutGuideSvgFilesPath=$(var.BinDir)\Assets\ShortcutGuide\?>
<?define ShortcutGuideAssetsFiles=?>
<?define ShortcutGuideAssetsFilesPath=$(var.BinDir)WinUI3Apps\Assets\ShortcutGuide\?>

<Fragment>
<!-- Shortcut guide files -->
<DirectoryRef Id="BaseApplicationsAssetsFolder">
<Directory Id="ShortcutGuideSvgsInstallFolder" Name="ShortcutGuide" />
<DirectoryRef Id="WinUI3AppsAssetsFolder">
<Directory Id="ShortcutGuideAssetsFolder" Name="ShortcutGuide" />
</DirectoryRef>
<DirectoryRef Id="ShortcutGuideSvgsInstallFolder" FileSource="$(var.ShortcutGuideSvgFilesPath)">
<DirectoryRef Id="ShortcutGuideAssetsFolder" FileSource="$(var.ShortcutGuideAssetsFilesPath)">
<!-- Generated by generateFileComponents.ps1 -->
<!--ShortcutGuideSvgFiles_Component_Def-->
<!--ShortcutGuideAssetsFiles_Component_Def-->
</DirectoryRef>

<!-- Shortcut guide -->
<ComponentGroup Id="ShortcutGuideComponentGroup" >
<Component Id="RemoveShortcutGuideFolder" Guid="AD1ABC55-B593-4A60-A86A-BA8C0ED493A5" Directory="ShortcutGuideSvgsInstallFolder" >
<Component Id="RemoveShortcutGuideFolder" Guid="AD1ABC55-B593-4A60-A86A-BA8C0ED493A5" Directory="ShortcutGuideAssetsFolder" >
<RegistryKey Root="$(var.RegistryScope)" Key="Software\Classes\powertoys\components">
<RegistryValue Type="string" Name="RemoveShortcutGuideFolder" Value="" KeyPath="yes"/>
</RegistryKey>
<RemoveFolder Id="RemoveFolderShortcutGuideSvgsInstallFolder" Directory="ShortcutGuideSvgsInstallFolder" On="uninstall"/>
<RemoveFolder Id="RemoveFolderShortcutGuideAssetsInstallFolder" Directory="ShortcutGuideAssetsFolder" On="uninstall"/>
</Component>
</ComponentGroup>

Expand Down
4 changes: 2 additions & 2 deletions installer/PowerToysSetup/generateAllFileComponents.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -305,8 +305,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 -regroot $registryroot
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\"
Expand Down
Loading
Loading