Text expansion has a particular failure signature: it works in nine applications and silently does nothing in the tenth. Nothing errors, nothing is logged, the trigger just sits there as literal text.
That is almost always correct behaviour, for a reason nobody has told you about. Here are the reasons, in the order they turn out to be the cause.
Rule out the boring causes first
- 1. Is expansion paused? Check the tray icon's tooltip.
Ctrl+Shift+Pausetoggles it and is easy to hit by accident. - 2. Did you press a delimiter? A snippet fires after Space, Tab or Enter, not the moment the trigger is complete.
- 3. Is the trigger exactly right?
;emailand;e-mailare different snippets, and a leading space you did not intend breaks the match. - 4. Did the app just start? Some applications create their input handling after the window appears. Type once, wait a second, type again.
If it works in Notepad and not in the app you care about, it is one of the following.
The other window is running as administrator
The most common cause and the least obvious.
Windows enforces User Interface Privilege Isolation: a process at normal integrity cannot send synthetic input to a process running elevated. Your expander is a normal desktop app. The elevated window — an admin PowerShell, a database console launched as administrator, an installer, some IT tooling — sits above it. The keystrokes are not blocked by the application; they are refused by the operating system.
It looks like this: expansion works in that same program when you launch it normally and stops the moment you launch it as administrator.
Three options, in order of preference. Run the target application without elevation, which most do not actually need. Run the expander as administrator too, so both sit at the same integrity level — a real trade-off, because an elevated process that hooks the keyboard is a larger thing to trust and it needs re-elevating on every start. Or use the clipboard for that one window.
There is no fourth. This is a security boundary working as designed.
It is a password field, or a password manager
Text Replacements blocks expansion in password fields, detected through Windows UI Automation, and keeps a denylist of password managers — 1Password, Bitwarden, KeePass, KeePassXC, LastPass, Dashlane, Keeper, Enpass — where it never expands at all.
This is deliberate and there is no setting for it. A tool that types stored text into a masked field eventually types the wrong stored text into a masked field, in a window you cannot read back.
It looks like this: expansion is dead in one specific field on a page, or everywhere inside your password manager, while the rest of the same application is fine.
It is a remote session or a virtual machine
Remote Desktop, Citrix, VMware, Hyper-V, Parsec, Windows Sandbox: your keystrokes are captured by the client and forwarded to the remote machine. The expander is running locally, watching keys already on their way elsewhere, and the application that would receive the expansion is not on this computer.
It looks like this: expansion works on your desktop and stops the instant focus enters the remote window.
The fix is to install inside the session. Text Replacements does not work in Windows Sandbox or in virtual machine guests when run from the host; the expander has to live on the same machine as the application receiving the text.
The application draws its own text
A few programs implement text input themselves rather than using standard Windows controls: some games, some cross-platform toolkits, some remote consoles, some terminal emulators in unusual modes.
These receive keystrokes normally but expose no accessible text field, and some consume input in a way a synthetic keystroke does not survive. There is no general fix. Use the clipboard for them, or keep the snippet somewhere you can copy from.
Enter is the send key
Not a failure of expansion but a collision.
In Slack, Teams, WhatsApp Desktop, Telegram and Discord, Enter sends the message. If your delimiter is Enter, you type ;sig, press Enter, and the app may send ;sig before the expansion lands — or send the first line of a multi-line replacement and start a new message with the rest.
- Use Space or Tab in chat apps. Type
;sigthen Space; the expansion lands and you press Enter deliberately. - Keep multi-line snippets out of chat. A replacement containing line breaks is split across several messages in any client where Enter sends. Use Shift+Enter inside the app for a real line break, and save multi-line snippets for mail and documents.
- Text Replacements offers two trigger modes: Space, Tab and Enter, or an extended mode that also fires after
.,!?. The extended mode suits sentence-end snippets and is set in Settings.
Security software has blocked the keyboard hook
Text expansion works through a low-level keyboard hook, the same mechanism a keylogger uses, and some endpoint protection products block it. Usually silently, and sometimes after an update that changed a policy rather than at install time.
It looks like this: expansion worked for weeks and then stopped everywhere at once, Notepad included.
Check your antivirus or EDR quarantine and exclusion lists for the expander's executable. On a managed work machine this is a conversation with IT rather than a setting you can change.
The keyboard layout, when your triggers are Latin and you are not
If you type in Russian, Greek, Hebrew, Arabic or another non-Latin layout, a trigger defined as ;email produces entirely different characters, and a naive matcher never sees it.
Text Replacements resolves the US-layout equivalent of each keypress and matches against that, so Latin triggers fire while you type in another layout. If you came from a different tool and your triggers stopped working when you switched layouts, this is the behaviour you were missing.
Quick reference
| Symptom | Cause | Fix |
|---|---|---|
| Works normally, fails when the app runs as admin | Integrity boundary | Match integrity levels, or do not elevate |
| Dead in one field only | Password field detection | By design |
| Dead in the whole app | Password manager denylist | By design |
| Stops at the remote window edge | Remote session, VM or Sandbox | Install inside the session |
| Trigger is sent as a message | Enter is the send key | Use Space or Tab as the delimiter |
| Multi-line snippet arrives as several messages | Enter sends each line | Do not use multi-line snippets in chat |
| Stopped everywhere at once | Security software blocked the hook | Add an exclusion |
| Nothing fires anywhere | Paused | Ctrl+Shift+Pause |