![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Есть процедура, которая отображает язык из трея на поле формы:
Код:
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
|
||||
|
||||
|
как эта программа показывает язык в трее?
http://data.cod.ru/112448 |
|
#3
|
|||
|
|||
|
Цитата:
|
|
#4
|
||||
|
||||
|
ну. если в трее RU, то показывает русский флаг, если EN, то американский.
|
|
#5
|
|||
|
|||
|
Тема висит уже 5 дней и не одного сообщения по сути. А жаль ...
Для меня эта задачка очень актуальна. Помогите, хотя бы, найти код для виртуальных клавиш Shift+Alt (переключение языка). Спасибо! Последний раз редактировалось cadil, 29.06.2011 в 13:19. |
|
#6
|
||||
|
||||
|
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
|
||||
|
||||
|
В общем где-то так:
Код:
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
|
||||
|
||||
|
функция:
Код:
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
|
|||
|
|||
|
Цитата:
Оператор работает с двумя программами. Одна из них развертывается на весь экран, закрывая при этом линейку меню "Пуск" и, соответственно, состояние клавиатуры в трее. Текст, набираемый в этой программе, переносится (захватывается, экспортируется) в чужое (другое) окно (программа, с кодами которой я работаю), которая располается поверх всех развернутых окон. Например, нажимаешь букву "П", а печатается "G" - информация о языке не видна! Хотелось бы сделать так, чтобы Код:
Label1.Caption := 'Русский'; Label1.Caption := 'Английский'; Спасибо! |
|
#10
|
||||
|
||||
|
Цитата:
Код:
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
|
||||
|
||||
|
Возникла такая мысль, а не создается ли для каждого окна свой личный KeyboardLayout? Ведь именно такое мы и наблюдаем, каждое окно может иметь свою текущую раскладку и тогда понятно почему смена раскладки в активном окне никак не влияет на неактивное.
|
|
#12
|
|||
|
|||
|
Цитата:
Именно! Так что надо делать хук на смену языка и менять Layout для конуретной программы. |
|
#13
|
||||
|
||||
|
попробую в 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. |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Hikari no Tenshi (02.01.2015)
| ||
|
#14
|
||||
|
||||
|
Цитата:
Не зря говорят правильно заданный вопрос содержит 90% ответа. ![]() |
|
#15
|
|||
|
|||
|
Цитата:
Наилучшие пожелания - Страдалецъ. Удач! |