Native TSF IME pure MSIX deployment

Maung Kaung 30 Reputation points
2026-09-06T17:28:50.6133333+00:00

I am developing Myanglish, a native third-party Windows TSF IME.

The classic Win32 installer works correctly:

  • TSF profile registration succeeds
  • TSF categories register successfully
  • InstallLayoutOrTip succeeds
  • Myanglish appears in Win+Space
  • Typing works

I want to distribute Myanglish directly through Microsoft Store as a pure MSIX, without requiring users to download a separate EXE/MSI installer.

My production MSIX uses:

  • windows.comServer
  • desktop7:CompatMode="classic"
  • desktop7:Scope="user"
  • Microsoft.classicAppCompat_8wekyb3d8bbwe
  • runFullTrust

During local Developer Mode testing, ITfInputProcessorProfileMgr::RegisterProfile returns HRESULT 0x80004005 inside the packaged process, while the same code succeeds outside MSIX.

Please confirm:

  1. Whether a native third-party TSF IME can officially be distributed as pure MSIX and appear in Win+Space.
  2. The supported method for TSF profile/category registration in MSIX.
  3. Whether classicAppCompat or any other capability is required.
  4. If pure MSIX is not supported, what Microsoft Store distribution model is recommended for native TSF IMEs.

I would appreciate an answer from a Windows/MSIX/TSF technical support engineer, with official documentation or a sample if available.

Windows development | Windows API - Win32
0 comments No comments

Answer accepted by question author
Tony Thach (WICLOUD CORPORATION) 1,120 Reputation points Microsoft External Staff Moderator
2026-09-07T03:02:28.6466667+00:00

Hi  @Maung Kaung , and thanks for posting your question. I created a minimal x64 C++ probe and ran it both unpackaged and with MSIX package identity. In the packaged process, these calls returned S_OK:

ITfInputProcessorProfiles::Register
ITfInputProcessorProfileMgr::RegisterProfile

Therefore, RegisterProfile() is not automatically blocked in a packaged full-trust process, and I could not reproduce 0x80004005 from package identity alone.

1.Pure MSIX support

At present, I cannot find public Microsoft documentation that explicitly supports or prohibits distributing a native third-party TSF IME as pure MSIX.

Microsoft documents the requirements for custom IMEs, including using TSF rather than IMM32, supporting AppContainer applications, and meeting the security and compatibility requirements of the hosting application. However, it does not provide an end-to-end pure-MSIX deployment procedure or sample for registering a TSF IME and exposing it in Win + Space.

The successful probe proves that registration can succeed. It does not yet prove COM activation, Win + Space visibility, DLL loading, typing, uninstall cleanup, or Store certification.

input-method-editor-requirements

2. Registration mechanism

TSF profiles and categories still require the standard TSF registration APIs. windows.comServer provides packaged COM registration, but it does not declare a TSF language profile or category. No dedicated TSF registration extension is documented in the public MSIX manifest schema.

text-service-registration

3.classicAppCompat

Microsoft.classicAppCompat_8wekyb3d8bbwe is required when an applicable extension uses:

desktop7:CompatMode="classic"

It controls classic registration behavior for that extension. It is not documented as a capability granting permission to register TSF profiles or categories.

element-desktop-extension

4. Store alternative

If the complete IME scenario cannot be implemented reliably with pure MSIX, Microsoft Store supports submitting the existing signed MSI/EXE installer through Partner Center. The installer must meet the Store’s signing, HTTPS hosting, installation, and package requirements.

app-package-requirements

Most likely area to investigate

Because the minimal probe succeeds but production fails, the highest-priority hypothesis is a registration scope or state conflict, particularly between:

  • desktop7:Scope="user" in the package.
  • Existing per-user or per-machine registration created by the Win32 installer.
  • Production CLSID/profile GUID data already present on the machine.

This is not yet confirmed. Note that Scope="user" applies to the relevant manifest extension and does not directly define the behavior of the TSF registration APIs.

Recommended next steps

  1. Capture the exact production call, all 12 parameters, HRESULT from each registration step, OS build, architecture, package full name, and existing COM/TSF registrations.
  2. Reproduce first in Windows Sandbox or a clean disposable VM, then replace one production parameter at a time.
  3. Test on the existing machine only after documenting its state, because changing an active IME registration could disable the installed IME.

Use the matching cleanup operations after every test:

RegisterProfile    → UnregisterProfile
RegisterCategory   → UnregisterCategory
Register           → Unregister
InstallLayoutOrTip → InstallLayoutOrTip with ILOT_UNINSTALL

If the clean packaged test still fails, capture a short ProcMon trace filtered to the probe executable. Start immediately before RegisterProfile(), stop immediately afterward, and include registry operations, CreateFile, Load Image, ACCESS DENIED, and NAME NOT FOUND.

Please remove credentials, secrets, access tokens, private information, and business-sensitive data before sharing the manifest, screenshots, or trace.

If this instruction is applicable to your situation, I would greatly appreciate it if you could follow the instruction here so others experiencing similar behavior can benefit from it as well.  

Was this answer helpful?

4 people found this answer helpful.

0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.