Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2016, 21:43   #1
Fiesko
Пользователь
 
Регистрация: 09.06.2012
Сообщений: 24
По умолчанию Подмена нажатой клавиши на другую

Цель: При нажатии клавиши(допустим) "b" в русской раскладке, заменить ее на(допустим) клавишу "u" в английской раскладке.
Пример: Вводим слово "привет", получаем "прuвет".
Имеется код:
Код:
const
  CNT_LAYOUT = 2;
  ENGLISH = $409;
  RUSSIAN = $419;

  TKbdValue : array [1..CNT_LAYOUT] of LongWord =
                ( ENGLISH,
                  RUSSIAN
                );
  TKbdDisplayNames : array [1..CNT_LAYOUT] of string =
                ('English',
                 'Русский'
                );

function NameKeyboardLayout(layout : LongWord) : string;
var
  i: integer;
begin
  Result:='';
  try
    for i:=1 to CNT_LAYOUT do
      if TKbdValue[i]=layout then Result:= TKbdDisplayNames[i];
  except
    Result:='';
  end;
end;

function GetActiveKbdLayout : LongWord;
begin
  result:= GetKeyboardLayout(0) shr $10;
end;

function GetActiveKbdLayoutWnd : LongWord;
var
  hWindow,idProcess : THandle;
begin
  hWindow := GetForegroundWindow;
  idProcess := GetWindowThreadProcessId(hWindow,nil);
  Result:=(GetKeyboardLayout(idProcess) shr $10);
end;

procedure SetKbdLayout(kbLayout : LongWord);
var
  Layout: HKL;
begin
  Layout:=LoadKeyboardLayout(PChar(IntToStr(kbLayout)), 0);
  ActivateKeyboardLayout(Layout,KLF_ACTIVATE);
end;
procedure SetLayoutActiveWnd(kbLayout : LongWord);
var
  Layout: HKL;
  hWindow : THandle;
begin
  hWindow := GetForegroundWindow;
  Layout:=LoadKeyboardLayout(PChar(IntToStr(kbLayout)), 0);
  sendMessage(hWindow,WM_INPUTLANGCHANGEREQUEST,1,Layout);
end;

procedure SetKeyMessage(Handle: HWND; Key: DWORD);
begin
  SendMessage(Handle, WM_KEYDOWN, Key, 0);
  SendMessage(Handle, WM_KEYUP, Key, 0);
end;

procedure SetKey(Key: DWORD);
begin
  keybd_event(Key, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
  keybd_event(Key, 0, KEYEVENTF_EXTENDEDKEY, 0);
  keybd_event(Key, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  RegisterHotKey(handle, $42, 0, $42);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotKey(handle, $42);
end;

procedure TForm1.WMHotKey(var Msg: TWMHotKey);
var
  Layout: array[0.. KL_NAMELENGTH] of char;
begin
  Case Msg.HotKey  of
    $42:
    begin
      if GetActiveKbdLayoutWnd = 1049 then
      begin
        SetLayoutActiveWnd(ENGLISH);
        SetKey($55);
        SetLayoutActiveWnd(RUSSIAN);
      end else
      begin
        SetKey($42);
        {...}
      end;
    end;
  end;
end;
Проблема в том, что не работает переключение на русскую раскладку. Получается что - то типа "Прudtn". С переключением на английскую раскладку проблем нет.

Так же сразу вопрос по этой же теме, дабы не создавать еще одну.
Каким образом можно реализовать ту же самую подмену клавиш с помощью выше приведенного кода, с нажатой клавишей SHIFT, или активированным CAPSLOCK?

Последний раз редактировалось Fiesko; 24.10.2016 в 22:10.
Fiesko вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal. Считывание нажатой клавиши Resp17 Помощь студентам 9 07.10.2014 19:18
Анализ нажатой клавиши monty "2" Помощь студентам 2 21.04.2010 17:42
Определение кода нажатой клавиши Fataller Общие вопросы C/C++ 8 07.11.2009 19:29
код нажатой клавиши galaid Общие вопросы Delphi 4 24.05.2009 20:03
Проблема с обработкой нажатой клавиши Bayazet Общие вопросы Delphi 7 10.02.2009 13:21