Возникла задача написания быстрого и удобного фронта кассира. Идеальным вариантом, считаю морды программ в продуктовых магазинах. Ничего лишнего, все наглядно. Ну да речь не об этом. Морду мы нарисовали, функционал накинули, но запускается она в терминале, эксплорер при этом не грузится, трея нет, а раскладка может быть разной. Ну и как-то надо раскладку на морду вывести. И вот тут выяснилось, что средствами 1с этого никак не сделать. Более того, скриптами JSи VBS – тоже никак, либо очень уж хитрое надо чего-то придумывать. Есть решения на базе ком - библиотек, типа “dllwrapper” (чтобы вызвать WINAPI), но их надо-же регить в системе, да и не все просто с ними. Да, это Дзен, но 1сник ленив, поэтому решено было написать свою ВК. За базу взят шаблон с диска ИТС на С++, статья с хабра: http://habrahabr.ru/post/191014/ и, конечно, MSDN. В итоге получилось вот такая поделка.
1. Возможности
1.1. Поддержка двух раскладок (кириллица и латиница) (методы: «ПолучитьРаскладкуБезОбработки() и УстановитьРаскладкуБезОбработки(ИДРаскладки)»).
1.2. Возможность установки и получения раскладок путем прямой передачи в компоненту языкового идентификатора (методы: «ПолучитьРаскладкуБезОбработки() и УстановитьРаскладкуБезОбработки(ИДЯзыка)»). Идентификаторы языков можно посмотреть на сайте msdnв статье «Language Identifier Constants and Strings». Т.е. например, для установки латинской раскладки на вход функции надо положить «00000409» (верхнее слово 0х0000h– всегда 0х0000, нижнее слово 0х0409h– как раз и является идентификатором языка), для установки кхмерской раскладки – «00000453» (при условии того, что кхмерский язык установлен в системе).
1.3. Чтение текущей раскладки для потока активного окна.
1.4. Установка раскладки для потока активного окна.
Если смотреть код на С++ в части полезной нагрузки, то там всего 2 функции:
HKL WINAPI LoadKeyboardLayout(LPCTSTR pwszKLID, UINT Flags);
BOOL WINAPI GetKeyboardLayoutName(LPTSTR pwszKLID);
Все.
Работает ВК так:
//================== инициализация
//ВККонтекст = Неопределено; Попытка
ПодключитьВнешнююКомпоненту(F:\ AddInNative.dll","kbd", ТипВнешнейКомпоненты.Native);
ВККонтекст = Новый("AddIn.kbd.KeyboardLayout");
Исключение
Сообщить("Ошибка при инициализации внешней копоненты!",СтатусСообщения.Важное);
Конецпопытки //================== Получение раскладки Если не ВККонтекст=Неопределено тогда
тРаскладка = ВККонтекст.ПолучитьРаскладку();
КонецЕсли; //================== Получение раскладки без обработки Если не ВККонтекст=Неопределено тогда
тРаскладка = ВККонтекст. ПолучитьРаскладкуБезОбработки ();
КонецЕсли; //================ Установка раскладки Если не ВККонтекст=неопределено тогда
ВККонтекст.УстановитьРаскладку("RUS"); //Русская раскладка
ВККонтекст.УстановитьРаскладку("ENG"); //Латинская раскладка
КонецЕсли;
//================ Установка раскладки без обработки Если не ВККонтекст=неопределено тогда
ВККонтекст. УстановитьРаскладкуБезОбработки ("00000419"); //Русская раскладка
ВККонтекст. УстановитьРаскладкуБезОбработки ("00000409"); //Латинская раскладка
КонецЕсли; ВККонтекст = Неопределено;
P.S.
ВК скомпилированана под 32 разряда, т.к. в общем, предназначена для работы в составе интерфейса и на сервере использоваться не будет.
Да, вот выкладываю таблицу кодов языков с сайта MSDN.
LANG_NEUTRAL | Default custom sublanguage |
0x1400 | Default custom MUI locale language |
0x007F | Invariant locale language |
0x0000 | Neutral locale language |
0x0800 | System default locale language |
0x1000 | Unspecified custom locale language |
0x0400 | User default locale language |
0x0436 | Afrikaans (af) |
0x041C | Albanian (sq) |
0x0484 | Alsatian (gsw) |
0x045E | Amharic (am) |
0x1401 | Arabic (ar) |
0x042B | Armenian (hy) |
0x044D | Assamese (as) |
0x082C | Azeri (az) |
0x0445 | Bangla (bn); see note 10 |
0x046D | Bashkir (ba) |
0x042D | Basque (eu) |
0x0423 | Belarusian (be) |
0x781A | Bosnian (bs) |
0x201A | Bosnian (bs); see note 2 |
0x047E | Breton (br) |
0x0402 | Bulgarian (bg) |
0x0492 | Central Kurdish (ku) |
0x045C | Cherokee (chr) |
0x0403 | Catalan (ca) |
0x0C04 | Chinese (zh); see note 1 |
0x0004 | Chinese (zh) |
0x7C04 | Chinese (zh) |
0x0483 | Corsican (co) |
0x001A | Croatian (hr); see note 2 |
0x101A | Croatian (hr) |
0x0405 | Czech (cs) |
0x0406 | Danish (da) |
0x048C | Dari (prs) |
0x0465 | Divehi (dv) |
0x0813 | Dutch (nl) |
0x0C09 | English (en) |
0x0425 | Estonian (et) |
0x0438 | Faroese (fo) |
0x0464 | Filipino (fil) |
0x040B | Finnish (fi) |
0x080c | French (fr) |
0x0462 | Frisian (fy) |
0x0456 | Galician (gl) |
0x0437 | Georgian (ka) |
0x0C07 | German (de) |
0x0408 | Greek (el) |
0x046F | Greenlandic (kl) |
0x0447 | Gujarati (gu) |
0x0468 | Hausa (ha) |
0x0475 | Hawiian (haw) |
0x040D | Hebrew (he) |
0x0439 | Hindi (hi) |
0x040E | Hungarian (hu) |
0x040F | Icelandic (is) |
0x0470 | Igbo (ig) |
0x0421 | Indonesian (id) |
0x085D | Inuktitut (iu) |
0x083C | Irish (ga); seenote 4 |
0x0434 | isiXhosa (xh) |
0x0435 | isiZulu (zu) |
0x0410 | Italian (it) |
0x0411 | Japanese (ja) |
0x044B | Kannada (kn) |
______ | (reserved) |
0x043F | Kazakh (kk) |
0x0453 | Khmer (kh) |
0x0486 | K'iche (qut) |
0x0487 | Kinyarwanda (rw) |
0x0457 | Konkani (kok) |
0x0412 | Korean (ko) |
0x0440 | Kyrgyz (ky) |
0x0454 | Lao (lo) |
0x0426 | Latvian (lv) |
0x0427 | Lithuanian (lt) |
0x082E | Lower Sorbian (dsb) |
0x046E | Luxembourgish (lb) |
0x042F | Macedonian (mk) |
0x083E | Malay (ms) |
0x044C | Malayalam (ml) |
0x043A | Maltese (mt) |
0x0481 | Maori (mi) |
0x047A | Mapudungun (arn) |
0x044E | Marathi (mr) |
0x047C | Mohawk (moh) |
0x0450 | Mongolian (mn) |
0x0461 | Nepali (ne) |
0x0414 | Norwegian (no) |
0x0482 | Occitan (oc) |
0x0448 | Oriya (or) |
0x0463 | Pashto (ps) |
0x0429 | Persian (fa); seenote 6 |
0x0415 | Polish (pl) |
0x0416 | Portuguese (pt) |
0x0867 | Pular (ff) |
0x0446 | Punjabi (pa) |
0x046B | Quechua (quz) |
0x0418 | Romanian (ro) |
0x0417 | Romansh (rm) |
0x0419 | Russian (ru) |
0x0485 | Sakha (sah); see note 9 |
0x243B | Sami (smn) |
0x103B | Sami (smj) |
0x0C3B | Sami (se) |
0x203B | Sami (sms) |
0x183B | Sami (sma) |
0x044F | Sanskrit (sa) |
0x7C1A | Serbian (sr); see note 2 |
0x046C | Sesotho sa Leboa (nso) |
0x0832 | Setswana / Tswana (tn) |
0x0459 | (reserved) |
0x0859 | Sindhi (sd) |
0x045B | Sinhala (si) |
0x041B | Slovak (sk) |
0x0424 | Slovenian (sl) |
0x2C0A | Spanish (es) |
0x0441 | Swahili (sw) |
0x081D | Swedish (sv) |
0x045A | Syriac (syr) |
0x0428 | Tajik (tg) |
0x085F | Tamazight (tzm) |
0x0449 | Tamil (ta) |
0x0444 | Tatar (tt) |
0x044A | Telugu (te) |
0x041E | Thai (th) |
0x0451 | Tibetan (bo) |
0x0873 | Tigrinya (ti) |
0x0873 | (reserved) |
0x041F | Turkish (tr) |
0x0442 | Turkmen (tk) |
0x0422 | Ukrainian (uk) |
0x042E | Upper Sorbian (hsb) |
0x0820 | Urdu (ur) |
0x0480 | Uyghur (ug) |
0x0843 | Uzbek (uz) |
0x0803 | Valencian (ca) |
0x042A | Vietnamese (vi) |
0x0452 | Welsh (cy) |
0x0488 | Wolof (wo) |
0x0478 | Yi (ii) |
0x046A | Yoruba (yo) |
В архиве 2 библиотеки: для 64 и для 32 разрядных ОС.