Языковая панель )

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by wikxer, 7 Mar 2011.

  1. wikxer

    wikxer New Member

    Joined:
    12 Nov 2010
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Народ подскажите способ получить текущий язык на языковой панели, как это реализовано в стандартном windows приложении "Экранная клавиатура"(C:\Windows\System32\osk.exe) . Пока расковырял проводник нашел вот это -

    [​IMG]

    Догадываюсь, что нужно ставить некий "хук", а как его ставить незнаю)
     
    #1 wikxer, 7 Mar 2011
    Last edited: 7 Mar 2011
  2. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Если не ошибаюсь, то WinAPI функция GetKeyboardLayoutName.

    Code:
    BOOL WINAPI [COLOR=DarkOrange]GetKeyboardLayoutName[/COLOR](
      __out  LPTSTR pwszKLID
    );
    один входной параметр - указатель на буфер, в который после выполнение функции будет занесен идентификатор языка (идентификаторы)
     
    #2 Sams, 7 Mar 2011
    Last edited: 7 Mar 2011
  3. wikxer

    wikxer New Member

    Joined:
    12 Nov 2010
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Да я пробовал так, если память не изменяет эта функция возвращает внутренний язык приложения в котором эта функция выполняется, а мне нужно получить язык из активного приложения, которое находится в фокусе, вот как это в "экранной клавиатуре" реализовано.
     
    #3 wikxer, 7 Mar 2011
    Last edited: 7 Mar 2011
  4. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    Тогда используй 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, передав идентификатор потока, получаем идентификатор языка.
     
    #4 Sams, 7 Mar 2011
    Last edited: 7 Mar 2011
  5. wikxer

    wikxer New Member

    Joined:
    12 Nov 2010
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Спасибо за алгоритм! Думаю это то, что мне нужно)
     
  6. Sams

    Sams Member

    Joined:
    18 Apr 2009
    Messages:
    247
    Likes Received:
    70
    Reputations:
    17
    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
     
    #6 Sams, 7 Mar 2011
    Last edited: 7 Mar 2011
    1 person likes this.
  7. wikxer

    wikxer New Member

    Joined:
    12 Nov 2010
    Messages:
    12
    Likes Received:
    1
    Reputations:
    0
    Да тему кажись можно и закрывать уже) здесь пример для .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