пʼятниця, 6 серпня 2010 р.

Дві клавіатури з різними розкладками


Купив собі вчора USB-клавіатуру. З португальською розкладкою. Думав, підключу і забуду про перемикання між розкладками. Чорта з два! Виявляється, що Вікна не прив'язують розкладки до конкретного пристрою. (Вони навмисне так все роблять, чи що?) І нема ніякої можливости це змінити! Лишається одне: визначати на ходу, на якій клавіатурі натиснуто кнопку і перемикати розкладки. Після довгих пошуків, я знайшов програмку, яка цим займається. При запуску вона лаялася на те, що не має достатньо прав. Виявилося, що це реакція на виклик чарівної функції SystemParametersInfo. Що вона робить лишилося для мене загадкою, оскільки перемикання прекрасно працює і без неї (принаймні під моєю сімкою). Програмку довелося допилювати, оскільки вона чомусь припускала, що одна мова повинна мати тільки одну розкладку. Хоч цілком логічно було б встановити різні розкладки для кожної фізичної клавіатури залежно від мови. Заразом виправив і це
foreach(Layout layout in RightKeyboard.Layout.GetLayouts()) {
   foreach(IntPtr installedLayout in installedLayouts) {
      ushort languageId = unchecked((ushort)installedLayout.ToInt32());
      if(layout.Identifier == languageId) {
         lbLayouts.Items.Add(layout);
      }
   }
}
Ну невже там замість масиву важко було мапу поставити?! Тепер програма (код, exe) розуміє також, що не треба викидати старше слово. По-хорошому, звичайно, треба було б додати правила перемикання залежно від поточної розкладки. Щоб вона знала, як після переключення мови переключити розкладку на правильну клавіатуру. Та мені ліньки цим займатися. Коли зовнішня клавіатура підключена, можна переключатися між португальською і українською автоматично — англійська не потрібна, бо всі необхідні букви є на португальській. Без зовнішньої клавіатури — відключаємо програму і перемикаємося вручну між українською і англійською розкладкою, яка стоїть за промовчанням замість португальської. У випадку двох розкладок з двома клавіатурами — взагалі проблем нема.

Наче працює... Головна проблема — введений символ доходить до місця призначення раніше, ніж відбувається перемикання. Так що треба вчитися починати писати з пробілів, бо розбиратися хто кому які повідомлення надсилає і як їх правильно перехоплювати, я, мабуть, не буду... Цікаво, що в Notepad++ цієї проблеми нема. Містика...

1 коментар: