Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
philosoffer
3 / 3 / 0
Регистрация: 19.02.2015
Сообщений: 28
#1

Индикация раскладки клавиатуры

20.05.2017, 17:36. Просмотров 385. Ответов 3
Метки нет (Все метки)

Ув. знатоки, возник такой вопрос. Необходимо, чтобы на форме отображался значок активного языка. Использую следующую процедуру:
Delphi
1
2
3
4
5
6
procedure TForm7.onLayoutChange(var msg: TMessage);
var Lang: array[0..2] of char;
begin
  GetLocaleInfo(loWord(msg.LParam), LOCALE_SABBREVLANGNAME, Lang, sizeOf(Lang));
  Label4.Caption := string(Lang);
end;
Все работает, если на форме нет других компонентов, кроме Label, но стоит добавить Edit или Button, всё. Работать отказывается. Подозреваю, что дело в фокусе ввода, но установить его на Label...

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2017, 17:36
Ответы с готовыми решениями:

Определение раскладки клавиатуры
пишу что то наподобие кейлогера. Есть однка проблема - не везбде определяет...

Включение смены раскладки клавиатуры
Привет всем. В своей программе для определенных целей прибиваю explorer....

Смена раскладки клавиатуры чужого окна
ShowWindow(h,SW_SHOW); BringWindowToTop(h); SetForegroundWindow(h);...

Определение раскладки клавиатуры активного окна
вот функция {активная раскладка в активном окне} function...

Контроль раскладки клавиатуры
Превед программистам :))) Прошу помощи в решении задачки :) В общем сделал...

3
D1973
Модератор
3334 / 2382 / 1182
Регистрация: 21.01.2014
Сообщений: 9,839
Записей в блоге: 3
Завершенные тесты: 1
20.05.2017, 19:42 #2
На форму таймер (свойство Interval = 500)
Delphi
1
2
3
4
5
6
7
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 case GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil)) of
  67699721 : Label1.Caption := 'EN';
  68748313 : Label1.Caption := 'RU';
 end;
end;
0
droider
Universal
Эксперт Pascal/Delphi
4393 / 2441 / 763
Регистрация: 04.10.2012
Сообщений: 8,875
20.05.2017, 20:28 #3
Цитата Сообщение от philosoffer Посмотреть сообщение
Все работает, если на форме нет других компонентов
Не работает. Тестировал на Windows 10 Pro x64, среда: Delphi XE3.

Цитата Сообщение от D1973 Посмотреть сообщение
На форму таймер
ИМХО, таймер - не очень хорошо

philosoffer, я делал так: возьмите компонент TApplicationEvents (вкладка Additional) и поместите его на форму. Пропишите функцию типа
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
Function GetWindowsLanguage: String;
var
Lang: array[0..$FFF] of WideChar; //для Delphi 7 будет Char
begin
GetKeyboardLayoutName(Lang);
case StrToInt(StrPas(Lang)) of
    409: Result :='EN'; //английский
    419: Result :='RU'; //русский
    401: Result :='AR';//арабский, у меня дополнительно включен
    else LoadKeyboardLayout('00000409',KLF_ACTIVATE);
         Result:='EN';
    end;
end;
В событии OnMessage компонента TApplicationsEvents вызывайте функцию
Delphi
1
2
3
4
5
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
Label1.Caption :=GetWindowsLanguage; //отображаем текущий язык
end;
См. мой тест на скрине
4
Изображения
 
philosoffer
3 / 3 / 0
Регистрация: 19.02.2015
Сообщений: 28
20.05.2017, 22:03  [ТС] #4
От таймера я отказался сразу(ну не нравится мне такой подход). Ваш пример работает, но у него есть недостаток. Если язык не перечислен в теле функции, то и переключаться на него не будет. Что не совсем удобно. В любом случае спасибо. Если не разберусь со своим вариантом, то воспользуюсь Вашим.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2017, 22:03

как перехватить изменение раскладки клавиатуры в любом приложении
ставил hook на "WM_INPUTLANGCHANGEREQUEST" не срабатывает пробывал на...

Изменение раскладки
как в delphi преобразовать строку 'rfhtnf' в 'карета' т.е как бы изменить...

Смена раскладки клавиатуры
Нашел линк на киберфорум, но он оказался битым. Ни у кого нет кусочка кода с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru