Make a Windows PC feel like a Mac when you access it via Windows App or RDP.
One command. Zero config.
Cmd+←, Option+←, Cmd+Backspace, Cmd+Shift+4 — they all just work.
You're a MacBook user. Your day-job PC is a Windows box you only reach over RDP (Windows App, Microsoft Remote Desktop, AWS WorkSpaces, Azure Virtual Desktop, Parallels Client).
Every time you connect:
Cmd+Left/Rightdoesn't jump to line start/end.Option+Left/Rightdoesn't skip words.Cmd+Backspacedoesn't nuke the current line.Cmd+Shift+4doesn't take a screenshot.- Your Mac keyboard types
Çout of nowhere because Windows picked a Brazilian layout. - Context switching between both machines rewires your muscle memory daily.
mac-win-app sets up three things so the remote Windows feels native to a Mac user:
- Keyboard layout that matches your MacBook (US, US-International, or ABNT2 for BR keyboards).
- AutoHotkey v2 script that translates the macOS shortcuts the Windows App doesn't handle on its own (word/line navigation, deletion, screenshots, tab switching).
- Conditional activation — the script only fires inside RDP sessions. If someone logs into the physical machine, the script stays idle. No surprises.
All in your user scope. No admin rights. No registry hacks. Fully reversible.
Inside your remote Windows session, open PowerShell and run:
iwr -useb https://raw.githubusercontent.com/feliperun/mac-win-app/main/install.ps1 | iexThe installer will:
- Install AutoHotkey v2 via
winget(if missing) - Prompt for your keyboard layout (US / US-Intl / ABNT2)
- Drop the scripts into
%LOCALAPPDATA%\mac-win-app - Start the shortcut translator
- Register it to run at login
Then:
- Open Windows App → Settings → Keyboard and enable Send Mac shortcut keys as Windows shortcut keys.
- Disconnect and reconnect the RDP session so the keyboard layout is picked up.
- Try
Cmd+Left,Option+Shift+Right,Cmd+Shift+4.
# One-liner with preset layout
& ([scriptblock]::Create((iwr -useb https://raw.githubusercontent.com/feliperun/mac-win-app/main/install.ps1))) -Layout USIntl
# Or clone + run
git clone https://github.com/feliperun/mac-win-app
cd mac-win-app
.\install.ps1 -Layout US| MacBook gesture | What happens in Windows |
|---|---|
Cmd + C / V / X / A / Z / S / F / T / W |
Copy, paste, cut, select-all, undo, save, find, new tab, close (via Windows App) |
Cmd + ← / Cmd + → |
Jump to start / end of line |
Cmd + ↑ / Cmd + ↓ |
Top / bottom of document |
Cmd + Shift + ←/→/↑/↓ |
Extend selection |
Option + ← / Option + → |
Jump one word |
Option + Shift + ←/→ |
Select one word |
Cmd + Backspace |
Delete to start of line |
Option + Backspace |
Delete previous word |
Cmd + H / Cmd + M |
Minimize window |
| `Cmd + `` (backtick) | Cycle windows (approximation of Mac's same-app cycling) |
Cmd + Shift + 3 |
Full-screen screenshot |
Cmd + Shift + 4 / Cmd + Shift + 5 |
Snipping Tool (area) |
Cmd + Option + ←/→ |
Previous / next tab |
Cmd + Shift + [ / ] |
Previous / next tab (Chrome/VSCode Mac style) |
Ctrl + Alt + P |
Pause/resume the translator |
See docs/shortcuts.md for the full list, including which ones are handled natively by the Windows App vs added by this project.
| Preset | Use when | Example |
|---|---|---|
| US pure | Mac ANSI keyboard, write code, never type Portuguese | ' and " are literal, no dead keys |
| US-International | Mac ANSI + sometimes write in pt/es/fr | ' + a = á, ~ + a = ã, AltGr + , = ç |
| ABNT2 | Mac with Brazilian layout | Native Ç and Portuguese diacritics |
┌────────────────┐ ┌────────────────────┐ ┌──────────────┐
│ MacBook │ │ Windows App (RDP) │ │ Windows PC │
│ Cmd + ← │──────▶│ translates Cmd→Ctrl│──────▶│ Ctrl + ← │
└────────────────┘ └────────────────────┘ └──────┬───────┘
│
▼
┌─────────────────────┐
│ mac-shortcuts.ahk │
│ Ctrl + ← → Home │
└─────────────────────┘
The Windows App already translates the basic Cmd → Ctrl shortcuts when you enable Send Mac shortcut keys as Windows shortcut keys. This project picks up from there — it covers cursor navigation, deletion, screenshots and other macOS idioms that the Windows App doesn't translate on its own.
The magic for safety: #HotIf IsRdpSession() at the top of the AHK script wraps every hotkey. On every keystroke AutoHotkey checks %SESSIONNAME%:
RDP-Tcp#0→ you're connected via Windows App → shortcuts activeConsole→ someone's physically at the keyboard → shortcuts idle
That single guard is what makes the tool safe on shared workstations.
Full details in docs/how-it-works.md.
iwr -useb https://raw.githubusercontent.com/feliperun/mac-win-app/main/uninstall.ps1 | iexThat stops the script, removes the autostart entry, and deletes %LOCALAPPDATA%\mac-win-app. Add -RemoveAutoHotkey -RestoreLayout if you want a full cleanup.
Does this need admin rights?
No. Everything runs in the current user scope: keyboard layout via Set-WinUserLanguageList, AHK installed in %LOCALAPPDATA%, autostart via shell:startup.
Will it affect people who log into the PC physically?
No. The script checks %SESSIONNAME% on every keystroke and stays idle for console (local) sessions. Only RDP and ICA (Citrix) sessions see the remapping.
Why not Karabiner-Elements on the Mac instead?
You can, and for some people that's cleaner. The trade-off:
- Karabiner (Mac side): remaps keys before they even leave the Mac. Lets you do app-specific rules. But it can't remap things that only exist on the Windows side, like "jump to end of line" when the Windows app doesn't interpret
Cmd+Right. - mac-win-app (Windows side): lives where the shortcuts actually execute. Works regardless of the client OS. Plus the keyboard-layout setup is Windows-side anyway.
If you want the best experience, you can use both — Karabiner for app-aware Mac-side rules, mac-win-app for the Windows-side heavy lifting.
Why PowerShell + AutoHotkey and not Rust?
Because it's a focused proof-of-concept and AutoHotkey's keyboard-hook implementation is rock-solid. A Rust rewrite is on the roadmap once the feature set stabilizes. See Roadmap.
I'm seeing `Ç` when I type apostrophe + c.
You're on US-International. That's the dead-key behavior. If you'd rather have literal ' and " at the cost of losing native accented characters, reinstall with -Layout US:
.\install.ps1 -Layout USDoes it work with AWS WorkSpaces / Azure Virtual Desktop / Parallels Client?
The AHK script works anywhere the session sets SESSIONNAME to an RDP-* or ICA-* value (standard for Windows remote sessions). Tested on Windows App (Mac). Community reports welcome — open an issue with your setup.
Can I customize the shortcuts?
Yes. Edit %LOCALAPPDATA%\mac-win-app\scripts\mac-shortcuts.ahk, then reload by killing the tray icon and double-clicking it again. See docs/how-it-works.md for AHK symbol reference.
How do I verify the install worked?
# Keyboard layout
Get-WinUserLanguageList | Format-List LanguageTag, InputMethodTips
# Script running
Get-Process AutoHotkey64
# Autostart registered
Test-Path "$([Environment]::GetFolderPath('Startup'))\mac-win-app.lnk"- v0.1 — PowerShell + AutoHotkey MVP
- v0.2 — Config file for custom mappings (TOML)
- v0.3 — Winget package (
winget install macwinapp) - v1.0 — Rust rewrite, single binary, no external dependencies
- Future — Parallels Client / AWS WorkSpaces client presets, app-specific rules
Issues and PRs welcome. If you use a remote Windows setup that isn't covered (Citrix, Parallels RAS, Chrome Remote Desktop, etc.), open an issue with:
- Client you use (name + version)
- Value of
$env:SESSIONNAMEinside the session - Shortcuts you wish worked
See docs/troubleshooting.md for common issues.
MIT. See LICENSE.
Built by a Mac user who got tired of retraining his muscle memory every morning. If this saves your sanity, consider starring the repo.