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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2011, 22:06   #1
mactepmac
Пользователь
 
Регистрация: 20.06.2011
Сообщений: 31
Вопрос Определение раскладки клавиатуры если программа не в фокусе

Код:

unit Unit1;

interface

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

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

var
  Form1: TForm1;

   KK : HKL;
  KBid : Integer;

  USKeyboard : integer;
  RusKeyboard : integer;



implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
USKeyboard:=1033;
  RusKeyboard:=1049;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin


KK := GetKeyboardLayout(0);
  KBid := LOWORD(KK);

  If KBid=1049 then label1.Caption:='русская раскладка'
 else label1.Caption:='английская раскладка';



end;

end.

Приведенная выше программа выдает состояние раскладки клавиатуры.

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

Как бы правильно определить раскладку клавиатуры если программа не в фокусе?
mactepmac вне форума Ответить с цитированием
Старый 31.07.2011, 23:02   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
если программа не в фокусе
Фокус ввода - термин, концепция и механизм, относящиеся не к программе , а к окну.
Окно - объект ОС, создаваемый конкретным объектом - кодовым потоком. Раскладка клавы - это индивидуальный элемент контекста каждого отдельно рассматриваемого существующего кодового потока.
В WinAPI есть ф-ция, позволяющая одному кодовому потоку "подключиться" к контексту ввода-вывода другого кодового потока - AttachThreadInput(). Эту ф-цию и следует курить для решения "задачи о раскладке".
mss вне форума Ответить с цитированием
Старый 01.08.2011, 07:45   #3
mactepmac
Пользователь
 
Регистрация: 20.06.2011
Сообщений: 31
По умолчанию

Спасибо конечно только я ничего не понял. Может быть маленький примерчик можно?
mactepmac вне форума Ответить с цитированием
Старый 01.08.2011, 08:30   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предположительно так: Выясняем какое окно в фокусе (GetFocus или я лично предпочитаю GetForegroundWindow), далее выясняем его главный поток (GetWindowThreadProcessId, или лучше будет использовать EnumThreadWindows), а уже потом можно тот ThreadId передавая в GetKeyboardLayout получить раскладку.
Это ИМХО, сам я не пробовал такое сочетание функций
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.08.2011, 09:04   #5
mactepmac
Пользователь
 
Регистрация: 20.06.2011
Сообщений: 31
По умолчанию

Код:

//***************** end of GetActiveKbdLayot ****************************
{активная раскладка в активном окне}
function GetActiveKbdLayoutWnd : LongWord;
var
 hWindow,idProcess : THandle;
begin
 // получить handle активного окна чужой программы
 hWindow := GetForegroundWindow;
 // Получить идентификатор чужого процесса
 idProcess := GetWindowThreadProcessId(hWindow,nil);
 // Получить текущуб раскладку в чужой программе

 Result:=(GetKeyboardLayout(idProcess) shr $10);

Нашел вот такую функцию. Но она возвращает одно и тоже значение 0.
В чем причина может быть?
mactepmac вне форума Ответить с цитированием
Старый 01.08.2011, 10:59   #6
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Та не, функция рабочая...
Вот например по таймеру все работает:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Caption := IntToStr(GetActiveKbdLayoutWnd);
end;
Будь проще и люди к тебе потянутся
spamer вне форума Ответить с цитированием
Старый 01.08.2011, 16:39   #7
mactepmac
Пользователь
 
Регистрация: 20.06.2011
Сообщений: 31
По умолчанию

Спс. Получилось
mactepmac вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хук на изменение раскладки клавиатуры Gerzs Win Api 1 03.07.2010 22:30
смена раскладки клавиатуры D_E_N Общие вопросы Delphi 2 17.05.2009 00:26
Определение раскладки клавиатуры micaell Win Api 2 14.03.2009 23:43
Смена раскладки клавиатуры NoName_emaNoN Общие вопросы Delphi 10 28.05.2008 08:55