Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 24.06.2011, 11:03
cadil cadil вне форума
Начинающий
 
Регистрация: 24.10.2007
Сообщения: 169
Репутация: 10
По умолчанию Отображение состояния клавиатуры на форме программы

Есть процедура, которая отображает язык из трея на поле формы:
Код:
procedure TForm1.TimerKTimer(Sender: TObject);
var
  buf: array [0..$ff] of Char;
begin
   if getasynckeystate($61)<>0 then
EditAdd.Text:='1';
  GetKeyboardLayoutName(buf);
  if ((StrPas(buf)= '00020409') or (StrPas(buf)= '00000409')) then LabelK.Caption:='EN';
  if StrPas(buf)= '00000419' then LabelK.Caption:='RU';
end;
Эта процедура работает, когда окно программы активно.
Помогите организовать эту процедуру так, чтобы она отображала состояние клавиатуры (язык) в том случае, когда программа находится в пассивном состоянии - по аналогии, например, с перехватом клавиш:
Код:
if getasynckeystate($61)<>0 then
EditAdd.Text:='1';
Спасибо!
Ответить с цитированием
  #2  
Старый 24.06.2011, 11:11
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

как эта программа показывает язык в трее?
http://data.cod.ru/112448
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 24.06.2011, 11:18
cadil cadil вне форума
Начинающий
 
Регистрация: 24.10.2007
Сообщения: 169
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
как эта программа показывает язык в трее?
http://data.cod.ru/112448
язык ИЗ трея (дублирует!)
Ответить с цитированием
  #4  
Старый 24.06.2011, 12:04
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну. если в трее RU, то показывает русский флаг, если EN, то американский.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 29.06.2011, 12:31
cadil cadil вне форума
Начинающий
 
Регистрация: 24.10.2007
Сообщения: 169
Репутация: 10
По умолчанию

Тема висит уже 5 дней и не одного сообщения по сути. А жаль ...
Для меня эта задачка очень актуальна.
Помогите, хотя бы, найти код для виртуальных клавиш Shift+Alt (переключение языка).
Спасибо!

Последний раз редактировалось cadil, 29.06.2011 в 13:19.
Ответить с цитированием
  #6  
Старый 29.06.2011, 13:32
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

cadil , ты не отвечаешь на мой ответ с ноября прошлого года
>твоя программа должна отображать язык текстом в поле на форме аналогично тому, как приведеная выше программа отображает язык в трее флагом? та программа не то, что не активна, у нее даже формы нет!
про перехват клавиш вообще не понял к чему...

есть модуль KeyboardLayout. в нем функция:
function NeedKeyboardLayout: Cardinal;

Код:
implementation

uses KeyboardLayout;

Edit1.Text:=IntToStr(NeedKeyboardLayout);

http://narod.ru/disk/17533643001/Key...ayout.dcu.html
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 29.06.2011 в 14:02.
Ответить с цитированием
  #7  
Старый 29.06.2011, 14:46
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

В общем где-то так:
Код:
  
type
  TForm1 = class(TForm)
    Label1: TLabel;
  private
    procedure InputLanguageChanged(var message: TMessage); message WM_INPUTLANGCHANGE;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.InputLanguageChanged(var Message: TMessage);
Var
 Rus, Eng: HKL;
begin
 inherited;
 Rus := LoadKeyboardLayout('00000419', 0);
 Eng := LoadKeyboardLayout('00000409', 0);
 if Message.lParam = Rus then Label1.Caption := 'Русский';
 if Message.lParam = Eng then Label1.Caption := 'Английский';
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 29.06.2011, 15:09
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

функция:

Код:
function NeedKeyboardLayout: Cardinal;
var
  hForegroundWindow: THandle;
  idProcess: DWORD;
begin
  hForegroundWindow:=GetForegroundWindow;
  idProcess:=GetWindowThreadProcessId(hForegroundWindow);
  Result:=LOWORD(GetKeyboardLayout(idProcess));
end;

использование в таймере, к примеру:

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  kbl: Cardinal;
begin
  kbl:=NeedKeyboardLayout;
  Label1.Caption:=IntToStr(kbl);
  case kbl of
    $409: Label2.Caption:='en';
    $419: Label2.Caption:='ru';
    else Label2.Caption:='oops';
  end;
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 29.06.2011, 17:13
cadil cadil вне форума
Начинающий
 
Регистрация: 24.10.2007
Сообщения: 169
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
В общем где-то так:

Похоже я недостаточно ясно обозначил задачу:
Оператор работает с двумя программами. Одна из них развертывается на весь экран, закрывая при этом линейку меню "Пуск" и, соответственно, состояние клавиатуры в трее. Текст, набираемый в этой программе, переносится (захватывается, экспортируется) в чужое (другое) окно (программа, с кодами которой я работаю), которая располается поверх всех развернутых окон.
Например, нажимаешь букву "П", а печатается "G" - информация о языке не видна!
Хотелось бы сделать так, чтобы
Код:
Label1.Caption := 'Русский';
Label1.Caption := 'Английский';
менялись не только в активном, но и ПАССИВНОМ состоянии программы.
Спасибо!
Ответить с цитированием
  #10  
Старый 29.06.2011, 18:23
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
Сообщение от cadil
Хотелось бы сделать так, чтобы
Код:
Label1.Caption := 'Русский';
Label1.Caption := 'Английский';
менялись не только в активном, но и ПАССИВНОМ состоянии программы.
Спасибо!
Согласен, не работает этот способ для фонового окна. Пока тут проводил эксперементы доперло, что можно еще проще это делать, вообще без обработки сообщений:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
Var CurrentLayout: HKL;
begin
 CurrentLayout := GetKeyboardLayout(0);
 if CurrentLayout = Rus then Label1.Caption := 'Русский';
 if CurrentLayout = Eng then Label1.Caption := 'Английский';
end;
Но вот только это не решает изначальную задачу. Будучи фоновым окном, данный код перестает правильно работать, а вот таймер при этом исправно работает и в фоне.
А вот почему это происходит я что-то не догоняю.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 29.06.2011, 19:06
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Возникла такая мысль, а не создается ли для каждого окна свой личный KeyboardLayout? Ведь именно такое мы и наблюдаем, каждое окно может иметь свою текущую раскладку и тогда понятно почему смена раскладки в активном окне никак не влияет на неактивное.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #12  
Старый 29.06.2011, 19:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,090
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Страдалецъ
Возникла такая мысль, а не создается ли для каждого окна свой личный KeyboardLayout? Ведь именно такое мы и наблюдаем, каждое окно может иметь свою текущую раскладку и тогда понятно почему смена раскладки в активном окне никак не влияет на неактивное.

Именно!
Так что надо делать хук на смену языка и менять Layout для конуретной программы.
Ответить с цитированием
  #13  
Старый 29.06.2011, 20:24
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

попробую в 3-ий раз показать) уже программа целиком:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
  hForegroundWindow: THandle;
  idProcess: DWORD;
  kbl: Cardinal;
begin
  hForegroundWindow:=GetForegroundWindow;
  idProcess:=GetWindowThreadProcessId(hForegroundWindow);
  kbl:=LOWORD(GetKeyboardLayout(idProcess));
  case kbl of
    $409: Label1.Caption:='Английский';
    $419: Label1.Caption:='Русский';
    else Label1.Caption:='Неизвестный';
  end;
end;

end.
не важно активно окно программы или нет - в любом случае показывает язык ввода активного окна.
Вложения
Тип файла: rar GetKeyboardLayout.rar (2.0 Кбайт, 14 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
Hikari no Tenshi (02.01.2015)
  #14  
Старый 30.06.2011, 09:21
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Цитата:
не важно активно окно программы или нет - в любом случае показывает язык ввода активного окна.
Вот она фраза которая для меня все расставила по местам. Действительно, зачем лезть так далеко, когда надо просто работать с активным окном.
Не зря говорят правильно заданный вопрос содержит 90% ответа.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #15  
Старый 30.06.2011, 11:07
cadil cadil вне форума
Начинающий
 
Регистрация: 24.10.2007
Сообщения: 169
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
попробую в 3-ий раз показать) уже программа целиком:
...
не важно активно окно программы или нет - в любом случае показывает язык ввода активного окна.
Искренне благодарю за терпение и выполненную работу. Это то, что нужно!
Наилучшие пожелания - Страдалецъ.
Удач!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:54.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025