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.
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.
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.
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
- Capture the exact production call, all 12 parameters, HRESULT from each registration step, OS build, architecture, package full name, and existing COM/TSF registrations.
- Reproduce first in Windows Sandbox or a clean disposable VM, then replace one production parameter at a time.
- 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.