По какому принципу работает Punto Switcher
PS не знает. Он всегда считает, что английский текст был набран в раскладке qwerty, в этом легко убедиться установив раскладку dvorak, например.
Вот в программе Опечатка все раскладки настраиваются в файле .ini, что делает предельно простым составление новых раскладок.
Потому что просто и красиво - это когда вызвал две функции системного апи и все уже заработало как надо. Вместо тонны самопальных таблиц, которые дублируют функционал оконной системы.
ж6393000012576445=16127110000000000000,
в английской:
;6393000012576445=16127110000000000000?
прога должна работать правильно при любой раскладке.
Пока рабочий вариант переключения раскладок такой:
{Преобразовывает символ CharCode из текущей раскладки в
символ CharCodeEn английской раскладки qwerty}
procedure GetCharCodeEn(CharCode: Integer; out CharCodeEn: Integer);
var
wVk: Word;
Vk: array [0..1] of Byte absolute wVk;
{Старший байт wVk - виртуальный код, младший - состояние служебных клавиш}
KeyState : TKeyboardState; //Массив состояний всех клавиш
AnsiKey: String; //В эту строку записываются выходные данных в API-функции
begin
GetKeyboardState(KeyState);
SetLength(AnsiKey, 2);
wVk := VkKeyScan(Chr(CharCode;
//Устанавливаем состояние служебный клавиш в массив KeyState
if (Vk[1] and 1) <> 0 then
KeyState[VK_SHIFT] := $80;
if (Vk[1] and 2) <> 0 then
KeyState[VK_CONTROL] := $80;
if (Vk[1] and 4) <> 0 then
KeyState[VK_MENU] := $80;
{LayoutEn вычисляется один раз при создании класса, т.к. существенно замедляет работу
FLayoutEn := LoadKeyboardLayout('00000409', KLF_NOTELLSHELL)}
if (ToAsciiEx(Vk[0], MapVirtualKey(Vk[0], 0 KeyState, @AnsiKey[1],
0, HookDriver.LayoutEn) = 1) then
CharCodeEn := ord(AnsiKey[1])
else
CharCodeEn := 0;
end;
Оставить комментарий
Corrector
Есть некоторый текст, набранный в раскладке X. Надо программно узнать (с помощью функций WinAPI каким был бы текст если его набрали в раскладке Y, как это делает панто свитчер. Можно конечно составить таблицу соответствий символов, но есть ли решение красивше?