Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Раскладка клавиатуры


Автор: CaLaT 20.3.2009, 18:55
Как получить раскладку клавиатуры именно текущего окна.

Есть пример от товарища Rouse_ , но на дельфи... у меня возникли сложности с переносом в си, кто может помогите плз

Код

procedure TfrmMain.Timer1Timer(Sender: TObject);
var
  FID: Cardinal;
begin
  FID := GetWindowThreadProcessId(GetForegroundWindow, nil);
  AttachThreadInput(GetCurrentThreadId, FID, True);
  Caption := IntToStr(GetKeyboardLayout(FID) and $FFFF);
  AttachThreadInput(GetCurrentThreadId, FID, False);  
end;


Автор: Earnest 20.3.2009, 19:05
Какие тут могут быть сложности? Все эти АПИ-функции доступны и в C и ровно с такими же именами.

Автор: CaLaT 20.3.2009, 19:05
Переписал этот код так:

Код

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{

  DWORD FID = GetWindowThreadProcessId(GetForegroundWindow, 0);
  AttachThreadInput(GetCurrentThreadId(), FID, True);
  Memo1->Lines->Add(PRIMARYLANGID(GetKeyboardLayout(FID)));
  AttachThreadInput(GetCurrentThreadId(), FID, False);
}


Но раскладка считывается с моего моего приложения, а не с активного... 

Help

Добавлено @ 19:07
2Earnest:
До меня просто долго доходило, что GetCurrentThreadId - это функция) И в си она пишется так -GetCurrentThreadId()  smile 

Автор: GremlinProg 23.3.2009, 15:10
а ты не задумывался, что в момент вызова GetForegroundWindow, на переднем плане находится именно твое окно?
добавляй в мемо к PRIMARYLANGID еще и текст заголовка окна переднего плана, тогда и найдешь ошибку

ps: код рабочий, даже без присоединения к чужому потоку (без AttachThreadInput)

Автор: CaLaT 23.3.2009, 21:26
Всё, спасибо, нашёл ошибку)

Добавлено через 2 минуты и 27 секунд
кстати PRIMARYLANGID - удобный такой макрос)

Автор: jonie 24.3.2009, 23:07
может кому-то будет интересно.
писал когда-то давно (лет эээ.. 6-ть назад если не больше) инликатор раскладки клавиатуры на assembler (MASM x86)
в аттаче исходники. устанавается используя inf файл (правой->установить).
работает мега тупо (подробности в исходниках) и содержит, вероятно, много ошибок и "хакерских" мест. as is и всё такое. мб кому пригодится, а то у меня пропадет...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)