Programowanie w języku Delphi » Artykuły

Układ klawiatury w naszym programie



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

ArgumentOpis
nbufDefiniuje ilość układów do załadowania, liczba może być mniejsza niż ilość zainstalowanych układów, ale nie większa
ListTablica 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:

ArgumentOpis
pwszKLIDJę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.
flagsdefiniuje jak układ ma być załadowany (opis w poniższej tabeli).
FlagaOpis
KLF_ACTIVATEJeżeli bieżący język nie jest załadowany, funkcja ładuje go i ustawia jako bieżący dla bieżącego wątku
KLF_NOTELLSHELLZapobiega wywołaniu hooka H_SHELL_LANGUAGE kiedy wybrany język jest ładowany
KLF_REORDEUstawia 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_REPLACELANGAtrybut 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_OKAtrybut 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;


ArgumentOpis
hklJest 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
FlagsDefiniuje 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;

ArgumentOpis
idThreadWątek z jakiego zostaną pobrane informacje, wartość 0 dla bieżącego wątku


function GetKeyboardLayoutName(pwszKLID: Integer): Boolean;

ArgumentOpis
pwszKLIDMiejsce 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;

ArgumentOpis
HKLuchwyt 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 komentarze

bordeux 2007-06-08 18:23

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

Patyk 2005-01-27 23:18

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

brodny 2005-01-22 11:28

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

Cool_Programming 2005-01-21 23:39

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.