Barra de idiomas altera o idioma no c # .NET
TL; DR: Tentando resolver o problema queInputLanguage
altera o layout de entrada, mas não atualiza a exibição da barra de idiomas.
Estou escrevendo um plugin personalizado para o Trados Studio. Parte disso está na interface com os idiomas no próprio aplicativo e no Word, como nesta pergunta:Lista de todos os idiomas disponíveis para a estrutura do Windows .NET
O último problema que parece não conseguir resolver é que em uma parte do código que estou usandoInputLanguage
para definir a entrada do teclado para en-US.
Para esclarecer, existe umaAPI limitada, então eu tenho que ser realmente inventivo ao automatizar certos aspectos. A melhor abordagem viável foi usar os atalhos padrão no aplicativo:
Primeiro, mudo o idioma de entrada para en-US.
Então eu envio algumas chaves para o aplicativo.
Então eu mudo o idioma de entrada para o que era antes.
Então eu mostro um formulário.
Aqui está o código:
//change input language to English
InputLanguage currentLang = InputLanguage.CurrentInputLanguage;
InputLanguage newLang = InputLanguage.FromCulture(System.Globalization.CultureInfo.GetCultureInfo("en-US"));
if (newLang == null)
{
MessageBox.Show("The Upload Project function requires the En-US keyboard installed.", "Missing keyboard", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
else
{
InputLanguage.CurrentInputLanguage = newLang;
}
//Save the document
SendKeys.SendWait("^s");
InputLanguage.CurrentInputLanguage = currentLang;
//get url and credentials from a custom input form
string[] psw = UploadData.GetPassword(
Settings.GetValue("Upload", "Uri", "https://www.scntranslations.org/ws/services"),
Vars.wsUsername == null ? Settings.GetValue("Upload", "User", "") : Vars.wsUsername,
Vars.wsPassword == null ? "" : Vars.wsPassword
);
Application.DoEvents();
A manifestação que tenho é que a barra de idiomas muda com um atraso paraPT mas quando o formulário aparecer, ele deverá estarHU ainda permanecePT.
No entanto, se eu testá-lo comDebug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName)
então a saída é o idioma correto (no meu caso "húngaro").
Mesmo depois que o formulário está oculto, o idioma permanecePT, mas os tipos de teclado em húngaro e emDebug.WriteLine(InputLanguage.CurrentInputLanguage.LayoutName)
retorna "húngaro".
Eu olhei para dezenas de páginas no SO e na Web e tentei de tudo que conseguia pensar, incluindoSystem.Threading.Thread.Sleep(1000);
eApplication.DoEvents()
eSendkeys.Flush()
, mas nada aciona o Windows para atualizar a barra de idiomas e não foi possível encontrar nenhuma solução para esse problema.
A versão anterior deste problema, conforme fornecida nesta pergunta:Alterar o layout do teclado do código C # com o .NET 4.5.2
Fiz este trabalho agora totalmente com a implementação acima doInputLanguage
barrar este último caos.
Alguém pode ajudar em:
dando uma explicação para esse comportamento?sugerindo uma solução que aciona a atualização da barra de idiomas do código c #?ATUALIZAR: O código agora funciona totalmente. Eu implementei o BlockInput WinAPI.
[System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "BlockInput")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool BlockInput([System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)] bool fBlockIt);
E também desative o Caps Lock usando a API do Win:
[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
private void TurnOffCapsLock()
{
if (Control.IsKeyLocked(Keys.CapsLock)) // Checks Capslock is on
{
const int KEYEVENTF_EXTENDEDKEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
NativeMethods.keybd_event(0x14, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr)0);
NativeMethods.keybd_event(0x14, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
(UIntPtr)0);
}
}
Então, o que resta realmente é fazer com que a Barra de idiomas mostre corretamente o idioma de entrada atual.
Eu tenho a opção de enviar Alt + Shifts, mas eu realmente não quero fazer isso.