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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2012, 15:59   #11
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Сделал так, и что то не наблюдал сбоев (для двух языков, больше и не надо):
Код:
...
type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure GetLang (var msg : TMessage); message WM_INPUTLANGCHANGE;
  private

...

procedure TForm1.GetLang(var msg: TMessage);
begin
  case msg.LParamLo of
    1033 : Label1.Caption := 'Английский';
    1049 : Label1.Caption := 'Русский';
  end;
end;
FaTaL вне форума Ответить с цитированием
Старый 17.05.2012, 15:17   #12
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Приведённый выше код работает только когда на форме нет контролов ввода. А вот если на форму кинуть например TEdit, то окно не реагирует на сообщение. Как этого избежать?
FaTaL вне форума Ответить с цитированием
Старый 18.05.2012, 00:03   #13
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Приведи плиз пример с ITfLanguageProfileNotifySink.
У меня нет готового примера с интерфейсами. Честно говоря, лениво писать, там достаточно сложный код.

Цитата:
Приведённый выше код работает только когда на форме нет контролов ввода. А вот если на форму кинуть например TEdit, то окно не реагирует на сообщение. Как этого избежать?
Ставить хук.

Вообще, я бы не рекомендовал использовать WM_INPUTLANGCHANGE. Забудьте про него, он устарел ещё в Windows XP, но это было не так заметно, поскольку раскладки остались старые. Но в Vista/Win7 это уже более заметно и чем дальше, тем будет хуже.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.05.2012, 08:27   #14
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

GunSmoker, можно примерчик с локальным хуком на WM_INPUTLANGCHANGE
FaTaL вне форума Ответить с цитированием
Старый 21.05.2012, 10:05   #15
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Может кто-нибудь поможет с примером без использования таймера?
Заранее благодарен.
FaTaL вне форума Ответить с цитированием
Старый 21.05.2012, 11:36   #16
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

для себя делал ч\з компонент TApplicationEvents в событии OnMessage писал:
Код:
function GetLanguage: string;
var
Lar: array[0..$FFF] of char;
begin
GetKeyboardLayoutName(Lar);
case StrToInt(StrPas(Lar)) of
    409: Result:='Язык: Английский';
    419: Result:='Язык: Русский';
    422: Result:='Язык: Украинский';
    else LoadKeyboardLayout('00000409',KLF_ACTIVATE);
         Result:='Язык: Английский';
    end;
end;
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 21.05.2012, 14:18   #17
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Если вызвать так Вашу функцию
Код:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  if msg.message = WM_INPUTLANGCHANGE then
    ShowMessage (GetLanguage);
end;
То она не срабатывает. А если без проверки на сообщение WM_INPUTLANGCHANGE, то функция постоянно выдаёт язык, т.к. реагирует на все сообщения окна.
Тут именно нужно как то ловить сообщение WM_INPUTLANGCHANGE. Вопрос КАК? Всезнающий GunSmoker не отвечает даже в аське.
FaTaL вне форума Ответить с цитированием
Старый 21.05.2012, 14:30   #18
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

уточню:
Код:
procedure TfLogin.AppEMessage(var Msg: tagMSG; var Handled: Boolean);
begin
lbLang.Caption:=GetLanguage;
end;
и зачем ее ловить? если она нормально реагирует на все изменения языка
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 21.05.2012 в 14:34.
Yurk@ вне форума Ответить с цитированием
Старый 21.05.2012, 14:33   #19
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

WM_INPUTLANGCHANGEREQUEST в Application.OnMessage для XP нормально отлавливает изменение языка ввода. Наверно GunSmoker прав, что не всегда, но пока не замечал бяк
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.05.2012, 15:24   #20
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

offtopic

Цитата:
Всезнающий GunSmoker не отвечает даже в аське.
Ты или спам-фильтр не прошёл или в игноре.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Раскладка клавиатуры DSK Общие вопросы Delphi 5 21.03.2011 04:28
Раскладка клавиатуры soktahan Microsoft Office Excel 2 24.11.2010 22:22
Раскладка клавиатуры Vladya Помощь студентам 10 21.05.2010 22:14
раскладка клавиатуры varelik Общие вопросы Delphi 4 07.12.2009 16:14
Раскладка клавиатуры bracomp Операционные системы общие вопросы 11 04.11.2009 21:45