function GetLayout(asWinNT: Boolean): string; begin case LoWord(GetKeyboardLayout(0)) of 1033: Result:= 'En'; 1049: Result:= 'Ru'; 1058: Result:= 'Uk' else Result:= '??'; end; if asWinNT then Result:= UpperCase(Result); end; procedure SetLayout(fLayout: string); var Layout : array[0..KL_NAMELENGTH] of Char; LayoutHKL: HKL; begin fLayout:= AnsiLowerCase(fLayout); if (fLayout = 'ru') then StrCopy(Layout, '00000419') // 00000419 - русская раскладка else if (fLayout = 'en') then StrCopy(Layout, '00000409') // 00000419 - английская раскладка else if (fLayout = 'uk') then StrCopy(Layout, '00000422') // 00000422 - украинская раскладка else Exit; LayoutHKL:= LoadKeyboardLayout(Layout, 0); ActivateKeyboardLayout(LayoutHKL, KLF_ACTIVATE); PostMessage(Application.Handle, WM_INPUTLANGCHANGEREQUEST, 1, LayoutHKL); end; procedure SetEngLayout; var Layout : array[0..KL_NAMELENGTH] of Char; LayoutHKL: HKL; begin StrCopy(Layout, '00000409'); // 00000419 - английская раскладка LayoutHKL:= LoadKeyboardLayout(Layout, 0); ActivateKeyboardLayout(LayoutHKL, KLF_ACTIVATE); PostMessage(Application.Handle, WM_INPUTLANGCHANGEREQUEST, 1, LayoutHKL); end; procedure TMainFrm.Button1Click(Sender: TObject); var fLayout: string; begin fLayout:= GetLayout(True); SetEngLayout; try // тут показываю модальный диалог воода логина/пароля // бла-бла-бла, типо обработка полученного логина/пароля finally SetLayout(fLayout); end; end; |