Переключение раскладки клавиатуры в GUI OpenEdge
Практически в каждом Windows-приложении используется winAPI. Но, используя современные версии OpenEdge это использование можно свести к минимуму.
К примеру, нам нужно переключить раскладку клавиатуры на каком-либо поле. Для этого надо объявить две внешние процедуры и позвать их с определенными значениями — 00000409 / 00000419.
PROCEDURE LoadKeyboardLayoutA EXTERNAL "user32" : DEFINE INPUT PARAMETER P1 AS CHAR. DEFINE INPUT PARAMETER P2 AS LONG. DEFINE RETURN PARAMETER pret AS LONG. END PROCEDURE. PROCEDURE ActivateKeyboardLayout EXTERNAL "user32" : DEFINE INPUT PARAMETER P1 AS LONG. DEFINE INPUT PARAMETER P2 AS LONG. END PROCEDURE. DEF VAR iLang AS INT NO-UNDO. RUN LoadKeyboardLayoutA (INPUT pcLayoutNum, INPUT 0, OUTPUT iLang). RUN ActivateKeyboardLayout (INPUT iLang, INPUT 0).
Но я заметил, что на некоторых наших машинах такой код может выполняться около двух секунд. Я решил глубоко не копать, а использовать всю мощь .Net. В итоге получился вот такой код-песочница, который исполняется быстро.
USING System.Windows.Forms.*. USING System.Globalization.CultureInfo. DEF VAR ruRU AS CLASS CultureInfo. DEF VAR enUS AS CLASS CultureInfo. DEF VAR rus AS CHAR FORMAT "X(30)". DEF VAR eng AS CHAR FORMAT "X(30)". ASSIGN ruRU = NEW CultureInfo( "ru-RU" ). enUS = NEW CultureInfo( "en-US" ). InputLanguage:CurrentInputLanguage = InputLanguage:FromCulture(ruRU). UPDATE rus. InputLanguage:CurrentInputLanguage = InputLanguage:FromCulture(enUS). UPDATE eng.