AutoHotKey , mencionado por harrymc, foi a solução.
Aqui está uma parte do código AutoHotKey que resolve meu problema específico. Letras faltantes podem ser facilmente adicionadas.
StringCaseSense On
; circumflex accents
$[::
Send [
Input, Char, T2 L1, {delete}{esc}{home}{end}
if Char = a
{
Send {backspace}â
return
}
Send %Char%
return
; grave accents
$'::
Send '
Input, Char, T2 L1, {delete}{esc}{home}{end}
if Char = a
{
Send {backspace}à
return
}
Send %Char%
return
; trema
+]::
Send {}}
Input, Char, T2 L1, {delete}{esc}{home}{end}
if Char = e
{
Send {backspace}ë
return
}
Send %Char%
return
; cedilla
$]::
Send ]
Input, Char, T2 L1, {delete}{esc}{home}{end}
if Char = c
{
Send {backspace}ç
return
}
Send %Char%
return
; other fixes
$<::
Send '
Input, Char, T2 L1, {delete}{esc}{home}{end}
if Char =
{
Send {backspace}<
return
}
Send %Char%
return
$/::
Send é
Input, Char, T2 L1, {delete}{esc}{home}{end}
if (Char = "")
{
Send {backspace}/
return
}
Send %Char%
return
$?::
Send É
Input, Char, T2 L1, {delete}{esc}{home}{end}
if (Char = "")
{
Send {backspace}?
return
}
Send %Char%
return