![]() |
|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
![]() Цитата:
Наилучшие пожелания - Страдалецъ. Удач! |