Возникла задача написания быстрого и
удобного фронта кассира. Идеальным вариантом, считаю морды программ в
продуктовых магазинах. Ничего лишнего, все наглядно. Ну да речь не об этом.
Морду мы нарисовали, функционал накинули, но запускается она в терминале,
эксплорер при этом не грузится, трея нет, а раскладка может быть разной. Ну и
как-то надо раскладку на морду вывести. И вот тут выяснилось, что средствами 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) |
Буду признателен, если добавите получение списка доступных раскладок.
Согласитесь, будет странно пытаться переключиться на раскладку, которой нет.
—
Второй момент — сейчас компонента определяет ЯЗЫК, а не раскладку.
Пример: у нас настроено по CTRL-SHIFT переключет язык (ENG — RUSUKR), а по ALT-SHIFT переключает именно раскладку (RUS-UKR).
Компонента на украинской раскладке выдаёт пустую строку.
(1) 7OH, Да, я обрабатываю код раскладки, выдаваемой winAPI. Если ее не обрабатывать, а просто пересылать в 1с, то компонента станет более универсальной, но тогда придется брать документацию из MSDN, впрочем это все детали. Я сделаю на этой неделе.
(1) 7OH, Да, и если нужны исходники, я могу их скинуть.
Я не против — уже вспомнил что такое MSDN, Вычитал функцию GetKeyboardLayoutList и вспомнил свои попытки ловить переключение языка.
Как скачавший разработку — надеюсь на доработку, а как программист готов допилить.
(4) 7OH,http://turbobit.net/5hkseab9sqbu.html . Это исходники.
Что-то зарегистрировать библиотеку не получается, пишет не найдена точка входа
(6) Hors, ее не надо регить. Это технология Native. Она сразу инициализируется в 1с. Вот так: ПодключитьВнешнююКомпоненту(F: AddInNative.dll»,»kbd», ТипВнешнейКомпоненты.Native);
(6) Hors, А потом — нужно создать объект:
ВККонтекст = Новый(«AddIn.kbd.KeyboardLayout»). И все методы применять к нему.
(5)Ссылка мертвая