Układ klawiatury w naszym programie
Cool_Programming
1 Wstęp
2 Ładowanie układu
3 Uaktywnienie języka dla aplikacji
4 Informacje o bieżącym języku
5 Usuwanie układu klawiatury
6 Zapamiętaj
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.
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 :)
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.