Repository navigation
Microsoft Store MSIX
The app can ship to the Microsoft Store as an MSIX, packaged as a full-trust Win32
desktop app (EntryPoint=Windows.FullTrustApplication). SendInput key synthesis, global
hotkeys, and the virtual-desktop registry reads all work exactly as in the plain-exe build.
Everything lives in
packaging/msix/.
The same binaries ship through both channels; behaviour that must differ is chosen at
runtime via Services/PackageContext.cs (IsPackaged, using GetCurrentPackageFullName):
| Concern | Plain-exe build | MSIX / Store build |
|---|---|---|
| Updates | GitHub Releases self-update | Disabled — the Store updates the app |
| Run at startup |
HKCU\…\Run registry value |
windows.startupTask via the StartupTask API |
The GitHub "Check for updates" tray item and Settings button are hidden when packaged.
Package.appxmanifest ships with PLACEHOLDER identity so it builds locally. Before your
first submission, replace three values with those from
Partner Center ▸ your app ▸ Product management ▸ Product identity:
| Manifest location | Partner Center field |
|---|---|
Identity/@Name |
Package/Identity/Name |
Identity/@Publisher (CN=…) |
Package/Identity/Publisher |
Properties/PublisherDisplayName |
Package/Properties/PublisherDisplayName |
No code-signing certificate is needed — the Store re-signs the package on ingestion. (A cert
is only required to sideload the .msix for local testing.)
CI (recommended): Actions tab → Build MSIX (Store) → Run workflow → enter the version
(e.g. 1.3.2). Download the .msix from the run's artifacts.
Locally:
pwsh packaging/msix/build-msix.ps1 -Version 1.3.2Regenerate the logo assets (only if the icon design changes):
pwsh packaging/msix/generate-assets.ps1- Reserve the app name in Partner Center (once) and fill in the three identity values above.
- Build the
.msix(CI or local). - Partner Center → new submission → Packages → upload the
.msix. - Complete the listing (description, screenshots, a 300×300+ Store logo, privacy policy, age rating) and submit for certification.
-
Undocumented COM (
IVirtualDesktopManagerInternal) is a runtime call automated cert is unlikely to flag, but it's a policy grey area and can break across Windows builds; the keystroke-stepping fallback keeps the app working if it fails. -
runFullTrustis a restricted capability — allowed for Desktop-Bridge apps, but review may ask for justification: "full-trust Win32 app synthesizing the native desktop-switch shortcut and reading virtual-desktop state." - After packaging, verify: overlay pinning across desktops,
%APPDATA%config read/write, and the startup-task toggle in Task Manager → Startup apps.
See
packaging/msix/README.md
for the authoritative details.