Народ подскажите способ получить текущий язык на языковой панели, как это реализовано в стандартном windows приложении "Экранная клавиатура"(C:\Windows\System32\osk.exe) . Пока расковырял проводник нашел вот это - Догадываюсь, что нужно ставить некий "хук", а как его ставить незнаю)
Если не ошибаюсь, то WinAPI функция GetKeyboardLayoutName. Code: BOOL WINAPI [COLOR=DarkOrange]GetKeyboardLayoutName[/COLOR]( __out LPTSTR pwszKLID ); один входной параметр - указатель на буфер, в который после выполнение функции будет занесен идентификатор языка (идентификаторы)
Да я пробовал так, если память не изменяет эта функция возвращает внутренний язык приложения в котором эта функция выполняется, а мне нужно получить язык из активного приложения, которое находится в фокусе, вот как это в "экранной клавиатуре" реализовано.
Тогда используй WinAPI функцию GetKeyboardLayout Code: HKL WINAPI [COLOR=DarkOrange]GetKeyboardLayout[/COLOR]( __in DWORD idThread ); параметром которой является идентификатор потока. Его в свою очередь можно получить используя GetWindowThreadProcessId Code: DWORD WINAPI[COLOR=DarkOrange] GetWindowThreadProcessId[/COLOR]( __in HWND hWnd, __out_opt LPDWORD lpdwProcessId ); а дескриптор окна при помощи FindWindow, либо GetActiveWindow т.е. : 1. Находим дескриптор окна. 2. При помощи GetWindowThreadProcessId узнаем идентификатор потока окна по его дескриптору. 3. При помощи GetKeyboardLayout, передав идентификатор потока, получаем идентификатор языка.
Delphi Code: var keyb: integer; keyb := GetKeyboardLayout(GetWindowThreadProcessId(FindWindow(nil, 'Мой компьютер'), nil)); Ассемблер MASM Code: .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data wTitle db 'Мой компьютер',0 keyb dd 0 .code Main: push offset wTitle push 0 call FindWindow push 0 push eax call GetWindowThreadProcessId push eax call GetKeyboardLayout mov keyb,eax push 0 call ExitProcess end Main
Да тему кажись можно и закрывать уже) здесь пример для .NET если кому надо http://forum.developing.ru/showthread.php/22246-%D0%9F%D0%BE%D0%BC%D0%BE%D0%B3%D0%B8%D1%82%D0%B5-%D1%81-GetKeyboardLayout?p=81956