Układ klawiatury w naszym programie

Cool_Programming

# Wstęp

Ten krótki artykuł przedstawia w jaki sposób możemy korzystać z innego przedefiniowanego układy klawiatury w naszym programie. W systemie Windows począwszy od NT 3.51 mamy możliwość wybrania dowolnego z zainstalowanych układów klawiatury (z ang. keyboard layout/IME) dla każdego procesu z osobna. Dodatkowo każdy układ przypisany jest do jednego języka (Input language). Przykładowo mamy do napisania referat z języka niemieckiego, dlatego w edytorze tekstu wybieramy układ Niemiecki (standardowy), jednak dodatkowo przeglądamy strony internetowe w poszukiwaniu materiałów i tutaj korzystamy z układu Polski (programisty)

Korzystając z funkcji API będziemy ustawiać język, a nie układ!

Listę zainstalowanych układów klawiatur możemy zobaczyć wybierając Start > Panel Sterowania > Klawiatura, następnie zakładka Język. Jak opisałem wyżej mamy do wyboru język i przypisany mu układ. Pomocna może być opcja Włącz wskaźnik na pasku zadań, gdyż w ten sposób, możemy szybko zobaczyć jak odpowiednimi funkcjami zmieniany język.

Zwróć uwagę, że niektóre opcje nie są obsługiwane w linii systemów 9x, jeżeli możesz sprawdź swój program w środowisku NT i 9x

# Ładowanie układu

Przed uaktywnieniem układu powinniśmy go załadować, wszelkie informacje o wybranym układzie przechowywane są w uchwycie (ang. handle) klawiatury - HKL. W środowisku 9x mamy do wyboru funkcje GetKeyboardLayoutList i LoadKeyboardLayout, w środowisku NT LoadKeyboardLayout;

function GetKeyboardLayoutList(nbuf: Integer; var List: HKL): Integer;

Funkcja ładuje zainstalowane układy klawiatury do tablicy

Argument Opis
nbuf Definiuje ilość układów do załadowania, liczba może być mniejsza niż ilość zainstalowanych układów, ale nie większa
List Tablica do której załadowane będą nasze układy

Funkcji zwróci ilość pomyślnie załadowanych układów to tablicy. Przykład:

var
  Layouts: array [0..3] of HKL; 
  Count: Integer;
begin
  Count := GetKeyboardLayoutList(3, Layouts);
  ShowMessage('Pomyślnie załadowano ' + IntToStr(Count) + ' układów');
end;
function LoadKeyboardLayout(pwszKLID: PAnsiChar; flags: Integer): HKL;

Funkcja zwraca układ klawiatury, podany przez parametry:

Argument Opis
pwszKLID Język jaki odpowiada określonemu układowi. W tym miejscu podajemy, tzw. identyfikator językowy jako łańcuch znaków. Pełną listę dostępnych języków możemy znaleźć w bibliotece msdn. Najpopularniejsze języki: Angielski (Stany Zjednoczone) - 00000409; Niemiecki (standardowy) - 00000407; Francuski (standardowy) - 0000040c; Polski - 00000415. Nie wszystkie identyfikatory dostępne są w wersjach 9x systemu Windows, dotyczy to szczególnie wersji Unicode.
flags definiuje jak układ ma być załadowany (opis w poniższej tabeli).
Flaga Opis
---------------- ----------------
KLF_ACTIVATE Jeżeli bieżący język nie jest załadowany, funkcja ładuje go i ustawia jako bieżący dla bieżącego wątku
KLF_NOTELLSHELL Zapobiega wywołaniu hooka H_SHELL_LANGUAGE kiedy wybrany język jest ładowany
KLF_REORDE Ustawia bieżący język jako pierwszy na liście i uaktywnia go. Ten atrybut nie przeniesie języka na pierwszą pozycję, jeśli został wywołany z KLF_ACTIVATE
KLF_REPLACELANG Atrybut ten zastępuje bieżący układ odpowiadającemu jemu językowi. Przykładowo jeżeli wybrałeś język Niemiecki (standardowy) i odpowiada jemu układ Niemiecki (szwajcarski), to ten atrybut zmieni układ na Niemiecki (standardowy)
KLF_SUBSTITUTE_OK Atrybut ten zastępuje bieżący język innym wybranym przez użytkownika. Domyślnie system podczas uruchamiania korzysta z tego atrybuty i zalecane jest, abyś ty też z niego skorzystał. Szczegóły w bibliotece msdn
KLF_SETFORPROCESS (tylko Windows 2000/XP) ten atrybut należy stosować łącznie z KLF_ACTIVATE, ustawia on układ dla bieżącego programu i wątku. Wysyłany jest komunikat WM_INPUTLANGCHANGE do bieżącego wątku lub aktywnego okna.

# Uaktywnienie języka dla aplikacji

Gdy już mamy uchwyt języka, możemy go teraz ustawić dla naszej aplikacji, służy do tego funkcja ActivateKeyboardLayout:

function ActivateKeyboardLayout(hkl: HKL; flags: Cardinal): HKL;
Argument Opis
hkl Jest to nasz uchwyt załadowany wcześniej w środowisku NT przez LoadKeyboardLayout, a w linii 9x przez GetKeyboardLayoutList lub przez LoadKeyboardLayout. Oprócz tego może to być jedna z podanych niżej wartości:
HKL_NEXT - ładuje następny język z listy zainstalowanych w systemie;
HKL_PREV - ładuje poprzedni język z listy zainstalowanych w systemie
Flags Definiuje jak wybrany język ma zostać uaktywniony:
KLF_REORDER - atrybut ten powoduje przejście wybranego języka na początek listy języków klawiatury zainstalowanych w systemie
KLF_RESET, KLF_SHIFTLOCK - jeśli ten atrybut jest ustawiony bez KLF_SHIFTLOCK to naciśnięcie klawisza CapsLock powoduje jego wyłączenie (jeżeli jest włączony), jeżeli zastosujesz do tego dodatkowo atrybut KLF_SHIFTLOCK to CapsLock zostanie wyłączony po naciśnięciu klawisza Shift KLF_SETFORPROCESS. Wybrany język zostanie uaktywniony dla wszystkich procesów, poprzez komunikat WM_INPUTLANGCHANGE. Tylko Windows 2000 i XP obsługują atrybuty KLF_RESET, KLF_SHIFTLOCK i KLF_SETFORPROCESS.

Funkcja zwraca uchwyt HKL poprzedniego języka lub 0 w przypadku błędu.

# Informacje o bieżącym języku

Wiemy już jak przełączyć układ, ale jak pobrać bieżący układ? To proste, mamy do dyspozycji dwie funkcje, które podadzą nam z jakiego układu korzysta teraz aplikacja

function GetKeyboardLayout(idThread: Integer): HKL;
Argument Opis
idThread Wątek z jakiego zostaną pobrane informacje, wartość 0 dla bieżącego wątku
function GetKeyboardLayoutName(pwszKLID: Integer): Boolean;
Argument Opis
pwszKLID Miejsce gdzie zostanie zapisana informacje o bieżącym układzie. Funkcja ta zwraca nam identyfikator językowy, który możemy wykorzystać w funkcji LoadKeyboardLayout

# Usuwanie układu klawiatury

Gdy mamy w systemie zainstalowanych za dużo układów, możemy je łatwo usunąć, służy do tego funkcja UnloadKeyboardLayout:

function UnloadKeyboardLayout(HKL: hkl): Boolean;
Argument Opis
HKL uchwyt układu jaki ma zostać usunięty z systemu
Jeśli układ nie zostanie usunięty poprawienie, funkcja zwróci wartość 0. Pamiętaj, aby przed usunięciem układu sprawdzić, czy nie jest on używany przez program. W systemie Windows NT, 2000 i XP nie możesz usunąć domyślnego układu

# Zapamiętaj

  • Wszelkie operacje dokonywane na układzie klawiatury, dotyczą bieżącego procesu lub wątku, a nie całego systemu,
  • Z poziomu funkcji API możesz tylko i wyłącznie operować na zainstalowanych układach.

4 komentarzy

To mój pierwszy artykuł, więc bardzo proszę o komentarze i ocene.
Kod HTML zastosowany w tabelkach może nie być zgodny ze wszystkimi przeglądarkami.
W przyszlości dorzuce może przykładowy program.

Mniejsza o to, ale jest ShowMessage('Pomyślnie załadowano '+IntToStr(count) + ' układów'; ... zapomniał dodac na koniec ), ale to wiadomo

Zdecydowanie lepszy sposób od mojego kombinowania z SendMessage() :) Pozdrawiam.

Przydatny artykuł :) Trochę przypomina układem (funkcja, opis, przykład, coś-tam-jeszcze :) ) spółkę Teixeira & Pacheco :)