Send Unicode (Citrix / RDP Compatibility)
Trigger expansion that crosses a Citrix, RDP, or VMware Horizon session can silently drop or mistranslate characters — most commonly _, ß, umlauts, or anything that needs a Shift press. “Send Unicode” tells Blue Synergy to use a layout-independent Windows SendInput path that survives the remote session’s keyboard-layout translation.
Shipped in 0.7.33.
Why it exists
Char-by-char typing normally uses VkKeyScanW to figure out the virtual-key code plus Shift state for each character, then sends the VK + Shift sequence via SendInput. That works locally, but Citrix ICA, Microsoft RDP, and VMware Horizon translate keystrokes through the remote keyboard layout. If the local layout is German and the remote is English (or vice versa), the remote side interprets the VK differently — _ on a local DE keyboard is Shift+-, but the same VK+Shift on a remote EN keyboard is… nothing meaningful, so the character is dropped or mistranslated.
The alternative Windows path, KEYEVENTF_UNICODE, sends the final UTF-16 code unit directly. The remote session sees the actual character, not a shifted virtual key, and types it as-is. Layout mismatches stop mattering.
Every clipboard/typing manager (Ditto, FastKeys, TextExpander, PhraseExpress) hits this wall eventually and adopts the same fix.
Global setting
Settings → Triggers → Send Unicode ▾ gives you three choices:
| Mode | Behaviour |
|---|---|
| Auto (default) | Detect Citrix Workspace (wfica32.exe, CDViewer.exe, SelfService.exe), Microsoft RDP (mstsc.exe, rdpclip.exe), or VMware Horizon (vmware-view.exe, HorizonClient.exe) in the foreground and switch to UNICODE. Other apps keep the legacy VK+Shift path. |
| Always | Every char-by-char expansion uses UNICODE, regardless of target. Useful when auto-detect misses your specific wrapper (e.g. a custom Citrix launcher). |
| Never | Force the legacy VK+Shift path. Only needed for apps that rely on raw scan codes or special IME composition the UNICODE path skips. Rare. |
Persisted in config.toml as [triggers].use_unicode_sendinput.
Per-trigger override
Open a trigger → Settings tab → Send Unicode ▾. Inherits the global setting unless set:
- Inherit (global setting) — obey whatever the global dropdown is.
- Always — force UNICODE for this trigger only. Good fallback if auto-detect doesn’t recognise your environment and you don’t want to flip the global for every trigger.
- Never — pin the legacy path for this trigger, even if global is set to
always.
Cascade: per-trigger override > global setting > auto-detection.
What this does NOT affect
- Paste-mode triggers (clipboard + Ctrl+V). This setting controls char-by-char typing only. Paste mode goes through the clipboard pipeline and has its own Citrix quirks (usually: clipboard-redirection must be enabled remote-side).
- Global hotkeys (keyword detection, Ctrl+Alt combos). The Windows hook that listens for your trigger keyword is unaffected.
- Scripts (SCR action type). Their output still goes through the standard paste/type path — but the trigger-body code itself runs locally on your machine, not remote.
When you shouldn’t need this
- You only use Blue Synergy locally (no RDP / Citrix / Horizon).
- Your local and remote keyboard layouts are identical.
- You never type Shift-requiring characters (
_,!,@,#,$, etc.) in remote sessions.
For these cases keeping Auto is fine — it won’t switch modes unless it detects a remote-wrapper process.
Character coverage
The UNICODE path emits one KEYEVENTF_UNICODE event per UTF-16 code unit. This means:
- BMP characters (U+0000..U+FFFF) — single event per char. Covers all of ASCII, Latin Extended, Greek, Cyrillic, most CJK basics, etc.
- Supplementary Plane (U+10000..U+10FFFF) — surrogate pair, two events. Emojis like 🎉, some rare scripts.
Both cases work. Composed characters (combining marks, joiners) pass through unchanged.
YAML round-trip
Copy as YAML / Export Trigger YAML include the per-trigger value when it’s not Inherit:
bs_trigger:
- keyword: ";foo"
description: "..."
app_profile: "All"
immediate: false
erase_method: null
use_unicode_sendinput: "always"
steps: [...]
Import-side round-trip (applying the field on File → Import YAML) is a follow-up; imported triggers currently get NULL (= inherit) and you re-set the override by hand after import.
Related
- triggers-keystroke-tokens — general char-by-char typing behaviour
- triggers-typing-mode — paste vs char-by-char mode (independent of this setting)
- triggers-yaml-import — the standard YAML-import dialog