Gambaran Umum Input Keyboard
Aplikasi harus menerima input pengguna dari keyboard serta dari mouse. Aplikasi menerima input keyboard dalam bentuk pesan yang diposting ke jendelanya.
Keyboard Input Model
Sistem menyediakan dukungan keyboard independen perangkat untuk aplikasi dengan menginstal driver perangkat keyboard yang sesuai untuk keyboard saat ini. Sistem menyediakan dukungan keyboard independen bahasa dengan menggunakan tata letak keyboard khusus bahasa yang saat ini dipilih oleh pengguna atau aplikasi. Driver perangkat keyboard menerima kode pemindaian dari keyboard, yang dikirim ke tata letak keyboard tempat mereka diterjemahkan ke dalam pesan dan diposting ke jendela yang sesuai di aplikasi Anda.
Ditetapkan ke setiap tombol pada keyboard adalah nilai unik yang disebut kode pemindaian, pengidentifikasi yang bergantung pada perangkat untuk tombol pada keyboard. Keyboard menghasilkan dua kode pemindaian saat pengguna mengetikkan kunci—satu saat pengguna menekan tombol dan lainnya saat pengguna merilis kunci.
Driver perangkat keyboard menginterpretasikan kode pemindaian dan menerjemahkannya ke kode kunci virtual, nilai independen perangkat yang ditentukan oleh sistem yang mengidentifikasi tujuan kunci. Setelah menerjemahkan kode pemindaian, tata letak keyboard membuat pesan yang menyertakan kode pemindaian, kode kunci virtual, dan informasi lain tentang penekanan tombol, lalu menempatkan pesan dalam antrean pesan sistem. Sistem menghapus pesan dari antrean pesan sistem dan mempostingnya ke antrean pesan dari utas yang sesuai. Akhirnya, perulangan pesan utas menghapus pesan dan meneruskannya ke prosedur jendela yang sesuai untuk diproses. Gambar berikut mengilustrasikan model input keyboard.
Fokus dan Aktivasi Keyboard
Sistem memposting pesan keyboard ke antrean pesan utas latar depan yang membuat jendela dengan fokus keyboard. Fokus keyboard adalah properti sementara dari jendela. Sistem berbagi keyboard di antara semua jendela pada layar dengan menggeser fokus keyboard, pada arah pengguna, dari satu jendela ke jendela lainnya. Jendela yang memiliki fokus keyboard menerima (dari antrean pesan utas yang membuatnya) semua pesan keyboard hingga fokus berubah ke jendela yang berbeda.
Utas dapat memanggil fungsi GetFocus untuk menentukan jendela mana (jika ada) yang saat ini memiliki fokus keyboard. Utas dapat memberikan fokus keyboard ke salah satu jendelanya dengan memanggil fungsi SetFocus. Ketika fokus keyboard berubah dari satu jendela ke jendela lain, sistem mengirim pesan WM_KILLFOCUS ke jendela yang telah kehilangan fokus, lalu mengirim pesan WM_SETFOCUS ke jendela yang telah mendapatkan fokus.
Konsep fokus keyboard terkait dengan jendela aktif. Jendela aktif adalah jendela tingkat atas yang sedang digunakan pengguna. Jendela dengan fokus keyboard adalah jendela aktif, atau jendela anak dari jendela aktif. Untuk membantu pengguna mengidentifikasi jendela aktif, sistem menempatkannya di bagian atas urutan Z dan menyoroti bilah judulnya (jika memiliki satu) dan batas.
Pengguna dapat mengaktifkan jendela tingkat atas dengan mengkliknya, memilihnya menggunakan kombinasi tombol ALT+TAB atau ALT+ESC, atau memilihnya dari Daftar Tugas. Utas dapat mengaktifkan jendela tingkat atas dengan menggunakan fungsi SetActiveWindow. Ini dapat menentukan apakah jendela tingkat atas yang dibuatnya aktif dengan menggunakan fungsi GetActiveWindow.
Ketika satu jendela dinonaktifkan dan satu lagi diaktifkan, sistem mengirim pesan WM_ACTIVATE. Kata berurutan rendah dari parameter wParam adalah nol jika jendela sedang dinonaktifkan dan bukan nol jika sedang diaktifkan. Saat prosedur jendela default menerima pesan WM_ACTIVATE , prosedur ini mengatur fokus keyboard ke jendela aktif.
Untuk memblokir peristiwa input keyboard dan mouse agar tidak mencapai aplikasi, gunakan BlockInput. Perhatikan, fungsi BlockInput tidak akan mengganggu tabel status input keyboard asinkron. Ini berarti bahwa memanggil fungsi SendInput saat input diblokir akan mengubah tabel status input keyboard asinkron.
Keystroke Pesan
Menekan tombol menyebabkan pesan WM_KEYDOWN atau WM_SYSKEYDOWN ditempatkan dalam antrean pesan utas yang dilampirkan ke jendela yang memiliki fokus keyboard. Merilis kunci menyebabkan pesan WM_KEYUP atau WM_SYSKEYUP ditempatkan dalam antrean.
Pesan key-up dan key-down biasanya terjadi berpasangan, tetapi jika pengguna menahan tombol cukup lama untuk memulai fitur pengulangan otomatis keyboard, sistem menghasilkan sejumlah pesan WM_KEYDOWN atau WM_SYSKEYDOWN berturut-turut. Kemudian menghasilkan satu pesan WM_KEYUP atau WM_SYSKEYUP saat pengguna merilis kunci.
Bagian ini membahas topik-topik berikut:
Keystroke Sistem dan Nonsystem
Sistem ini membuat perbedaan antara penekanan tombol sistem dan penekanan tombol nonsstem. Penekanan kunci sistem menghasilkan pesan penekanan kunci sistem, WM_SYSKEYDOWN dan WM_SYSKEYUP. Penekanan kunci nonsstem menghasilkan pesan penekanan kunci nonsstem, WM_KEYDOWN dan WM_KEYUP.
Jika prosedur jendela Anda harus memproses pesan penekanan kunci sistem, pastikan setelah memproses pesan, prosedur meneruskannya ke fungsi DefWindowProc. Jika tidak, semua operasi sistem yang melibatkan tombol ALT akan dinonaktifkan setiap kali jendela memiliki fokus keyboard. Artinya, pengguna tidak akan dapat mengakses menu jendela atau menu Sistem, atau menggunakan kombinasi tombol ALT+ESC atau ALT+TAB untuk mengaktifkan jendela yang berbeda.
Pesan penekanan kunci sistem terutama untuk digunakan oleh sistem daripada oleh aplikasi. Sistem menggunakannya untuk menyediakan antarmuka keyboard bawaannya ke menu dan untuk memungkinkan pengguna mengontrol jendela mana yang aktif. Pesan penekanan tombol sistem dihasilkan ketika pengguna mengetik kunci dalam kombinasi dengan kunci ALT, atau ketika jenis pengguna dan tidak ada jendela yang memiliki fokus keyboard (misalnya, ketika aplikasi aktif diminimalkan). Dalam hal ini, pesan diposting ke antrean pesan yang dilampirkan ke jendela aktif.
Pesan penekanan kunci nonsstem digunakan oleh jendela aplikasi; fungsi DefWindowProc tidak melakukan apa pun dengannya. Prosedur jendela dapat membuang pesan penekanan kunci nonsstem yang tidak diperlukan.
Kode Kunci Virtual Dijelaskan
Parameter wParam dari pesan penekanan tombol berisi kode kunci virtual kunci yang ditekan atau dirilis. Prosedur jendela memproses atau mengabaikan pesan penekanan kunci, tergantung pada nilai kode kunci virtual.
Prosedur jendela umum hanya memproses subset kecil dari pesan penekanan kunci yang diterima dan mengabaikan sisanya. Misalnya, prosedur jendela mungkin hanya memproses WM_KEYDOWN pesan penekanan tombol, dan hanya yang berisi kode kunci virtual untuk kunci gerakan kursor, tombol shift (juga disebut kunci kontrol), dan kunci fungsi. Prosedur jendela umum tidak memproses pesan penekanan kunci dari kunci karakter. Sebaliknya, ia menggunakan fungsi TranslateMessage untuk mengonversi pesan menjadi pesan karakter. Untuk informasi selengkapnya tentang TranslateMessage dan pesan karakter, lihat Pesan Karakter.
Bendera Pesan Keystroke
Parameter lParam dari pesan keystroke berisi informasi tambahan tentang penekanan kunci yang menghasilkan pesan. Informasi ini mencakup jumlah pengulangan, kode pemindaian, bendera extended-key, kode konteks, bendera status kunci sebelumnya, dan bendera status transisi. Ilustrasi berikut menunjukkan lokasi bendera dan nilai ini dalam parameter lParam .
Aplikasi dapat menggunakan nilai berikut untuk mendapatkan bendera penekanan kunci dari kata urutan tinggi dari lParam.
Nilai | Deskripsi |
---|---|
KF_EXTENDED 0x0100 |
Memanipulasi bendera kunci yang diperluas. |
KF_DLGMODE 0x0800 |
Memanipulasi bendera mode dialog, yang menunjukkan apakah kotak dialog aktif. |
KF_MENUMODE 0x1000 |
Memanipulasi bendera mode menu, yang menunjukkan apakah menu aktif. |
KF_ALTDOWN 0x2000 |
Memanipulasi bendera kode konteks. |
KF_REPEAT 0x4000 |
Memanipulasi bendera status kunci sebelumnya. |
KF_UP 0x8000 |
Memanipulasi bendera status transisi. |
Contoh kode:
case WM_KEYDOWN:
case WM_KEYUP:
case WM_SYSKEYDOWN:
case WM_SYSKEYUP:
{
WORD vkCode = LOWORD(wParam); // virtual-key code
WORD keyFlags = HIWORD(lParam);
WORD scanCode = LOBYTE(keyFlags); // scan code
BOOL isExtendedKey = (keyFlags & KF_EXTENDED) == KF_EXTENDED; // extended-key flag, 1 if scancode has 0xE0 prefix
if (isExtendedKey)
scanCode = MAKEWORD(scanCode, 0xE0);
BOOL wasKeyDown = (keyFlags & KF_REPEAT) == KF_REPEAT; // previous key-state flag, 1 on autorepeat
WORD repeatCount = LOWORD(lParam); // repeat count, > 0 if several keydown messages was combined into one message
BOOL isKeyReleased = (keyFlags & KF_UP) == KF_UP; // transition-state flag, 1 on keyup
// if we want to distinguish these keys:
switch (vkCode)
{
case VK_SHIFT: // converts to VK_LSHIFT or VK_RSHIFT
case VK_CONTROL: // converts to VK_LCONTROL or VK_RCONTROL
case VK_MENU: // converts to VK_LMENU or VK_RMENU
vkCode = LOWORD(MapVirtualKeyW(scanCode, MAPVK_VSC_TO_VK_EX));
break;
}
// ...
}
break;
Jumlah Ulangi
Anda dapat memeriksa jumlah pengulangan untuk menentukan apakah pesan penekanan kunci mewakili lebih dari satu penekanan tombol. Sistem menaikkan jumlah saat keyboard menghasilkan pesan WM_KEYDOWN atau WM_SYSKEYDOWN lebih cepat daripada yang dapat diproses aplikasi. Ini sering terjadi ketika pengguna menahan tombol cukup lama untuk memulai fitur pengulangan otomatis keyboard. Alih-alih mengisi antrean pesan sistem dengan pesan key-down yang dihasilkan, sistem menggabungkan pesan ke dalam satu pesan kunci ke bawah dan meningkatkan jumlah pengulangan. Merilis kunci tidak dapat memulai fitur pengulangan otomatis, sehingga jumlah pengulangan untuk pesan WM_KEYUP dan WM_SYSKEYUP selalu diatur ke 1.
Kode Pemindaian
Kode pemindaian adalah nilai yang dihasilkan sistem saat pengguna menekan kunci. Ini adalah nilai yang mengidentifikasi tombol yang ditekan terlepas dari tata letak keyboard aktif, dibandingkan dengan karakter yang diwakili oleh tombol. Aplikasi biasanya mengabaikan kode pemindaian. Sebaliknya, ia menggunakan kode kunci virtual untuk menginterpretasikan pesan penekanan kunci.
Keyboard modern menggunakan spesifikasi Perangkat Antarmuka Manusia (HID) untuk berkomunikasi dengan komputer. Driver keyboard mengonversi nilai Penggunaan HID yang dilaporkan dikirim dari keyboard untuk memindai kode dan meneruskannya ke aplikasi.
Catatan
Meskipun kode kunci virtual biasanya lebih berguna untuk aplikasi desktop, kode pemindaian mungkin diperlukan dalam kasus tertentu ketika Anda perlu mengetahui tombol mana yang ditekan terlepas dari tata letak keyboard saat ini. Misalnya, pengikatan kunci WASD (W sudah habis, A dibiarkan, S tidak berfungsi, dan D benar) untuk game, yang memastikan formasi kunci yang konsisten di seluruh tata letak keyboard US QWERTY atau French AZERTY .
Tabel berikut mencantumkan kumpulan Kode Pemindaian seperti yang saat ini dikenali oleh Windows. Nilai Nama Penggunaan HID Halaman Penggunaan/HID/mereferensikan dokumen Tabel Penggunaan HID. Nilai Lokasi Kunci mereferensikan gambar keyboard sebelumnya.
Kode Scan 1 Make dikirimkan dalam pesan WM_SYSKEYUP/dan WM_INPUT WM_KEYDOWN WM_KEYUP/WM_SYSKEYDOWN./
Nama Halaman Penggunaan HID | Nama Penggunaan HID | Halaman Penggunaan HID | ID Penggunaan HID | Pindai 1 Buat | Lokasi Kunci |
---|---|---|---|---|---|
Desktop Generik | Sistem Matikan Daya | 0x0001 | 0x0081 | 0xE05E | |
Desktop Generik | Sistem Tidur | 0x0001 | 0x0082 | 0xE05F | |
Desktop Generik | Sistem Bangun | 0x0001 | 0x0083 | 0xE063 | |
Keyboard/Keypad | ErrorRollOver | 0x0007 | 0x0001 | 0x00FF | |
Keyboard/Keypad | Keyboard A | 0x0007 | 0x0004 | 0x001E | 31 |
Keyboard/Keypad | Keyboard B | 0x0007 | 0x0005 | 0x0030 | 50 |
Keyboard/Keypad | Keyboard C | 0x0007 | 0x0006 | 0x002E | 48 |
Keyboard/Keypad | Keyboard D | 0x0007 | 0x0007 | 0x0020 | 33 |
Keyboard/Keypad | Keyboard E | 0x0007 | 0x0008 | 0x0012 | 19 |
Keyboard/Keypad | Keyboard F | 0x0007 | 0x0009 | 0x0021 | 34 |
Keyboard/Keypad | Keyboard G | 0x0007 | 0x000A | 0x0022 | 35 |
Keyboard/Keypad | Keyboard H | 0x0007 | 0x000B | 0x0023 | 36 |
Keyboard/Keypad | Keyboard I | 0x0007 | 0x000C | 0x0017 | 24 |
Keyboard/Keypad | Keyboard J | 0x0007 | 0x000D | 0x0024 | 37 |
Keyboard/Keypad | Keyboard K | 0x0007 | 0x000E | 0x0025 | 38 |
Keyboard/Keypad | Keyboard L | 0x0007 | 0x000F | 0x0026 | 39 |
Keyboard/Keypad | Keyboard M | 0x0007 | 0x0010 | 0x0032 | 52 |
Keyboard/Keypad | Keyboard N | 0x0007 | 0x0011 | 0x0031 | 51 |
Keyboard/Keypad | Keyboard O | 0x0007 | 0x0012 | 0x0018 | 25 |
Keyboard/Keypad | Keyboard P | 0x0007 | 0x0013 | 0x0019 | 26 |
Keyboard/Keypad | Keyboard Q | 0x0007 | 0x0014 | 0x0010 | 17 |
Keyboard/Keypad | Keyboard R | 0x0007 | 0x0015 | 0x0013 | 20 |
Keyboard/Keypad | Keyboard S | 0x0007 | 0x0016 | 0x001F | 32 |
Keyboard/Keypad | Keyboard T | 0x0007 | 0x0017 | 0x0014 | 21 |
Keyboard/Keypad | Keyboard U | 0x0007 | 0x0018 | 0x0016 | 23 |
Keyboard/Keypad | Keyboard V | 0x0007 | 0x0019 | 0x002F | 49 |
Keyboard/Keypad | Keyboard W | 0x0007 | 0x001A | 0x0011 | 18 |
Keyboard/Keypad | Keyboard X | 0x0007 | 0x001B | 0x002D | 47 |
Keyboard/Keypad | Keyboard Y | 0x0007 | 0x001C | 0x0015 | 22 |
Keyboard/Keypad | Keyboard Z | 0x0007 | 0x001D | 0x002C | 46 |
Keyboard/Keypad | Keyboard 1 dan Bang | 0x0007 | 0x001E | 0x0002 | 2 |
Keyboard/Keypad | Keyboard 2 dan Pada | 0x0007 | 0x001F | 0x0003 | 3 |
Keyboard/Keypad | Keyboard 3 Dan Hash | 0x0007 | 0x0020 | 0x0004 | 4 |
Keyboard/Keypad | Keyboard 4 dan Dolar | 0x0007 | 0x0021 | 0x0005 | 5 |
Keyboard/Keypad | Keyboard 5 dan Persen | 0x0007 | 0x0022 | 0x0006 | 6 |
Keyboard/Keypad | Keyboard 6 dan Caret | 0x0007 | 0x0023 | 0x0007 | 7 |
Keyboard/Keypad | Keyboard 7 dan Ampersand | 0x0007 | 0x0024 | 0x0008 | 8 |
Keyboard/Keypad | Keyboard 8 dan Bintang | 0x0007 | 0x0025 | 0x0009 | 9 |
Keyboard/Keypad | Keyboard 9 dan Kurung Kiri | 0x0007 | 0x0026 | 0x000A | 10 |
Keyboard/Keypad | Keyboard 0 dan Kurung Siku Kanan | 0x0007 | 0x0027 | 0x000B | 11 |
Keyboard/Keypad | Keyboard KembaliKan Enter | 0x0007 | 0x0028 | 0x001C | 43 |
Keyboard/Keypad | Keyboard Escape | 0x0007 | 0x0029 | 0x0001 | 110 |
Keyboard/Keypad | Hapus Keyboard | 0x0007 | 0x002A | 0x000E | 15 |
Keyboard/Keypad | Keyboard Tab | 0x0007 | 0x002B | 0x000F | 16 |
Keyboard/Keypad | Bilah Spasi Papan Ketik | 0x0007 | 0x002C | 0x0039 | 61 |
Keyboard/Keypad | Garis Putus keyboard dan Garis Bawah | 0x0007 | 0x002D | 0x000C | 12 |
Keyboard/Keypad | Keyboard Sama dengan dan Plus | 0x0007 | 0x002E | 0x000D | 13 |
Keyboard/Keypad | Kurung Kurawal Kiri Keyboard | 0x0007 | 0x002F | 0x001A | 27 |
Keyboard/Keypad | Kurung Kurawal Kanan Keyboard | 0x0007 | 0x0030 | 0x001B | 28 |
Keyboard/Keypad | Pipa Keyboard dan Garis Miring | 0x0007 | 0x0031 | 0x002B | 29 |
Keyboard/Keypad | Keyboard Non-AS | 0x0007 | 0x0032 | 0x002B | 42 |
Keyboard/Keypad | Papan Ketik Titik Koma dan Titik Dua | 0x0007 | 0x0033 | 0x0027 | 40 |
Keyboard/Keypad | Tanda Kutip Keyboard dan Tanda Kutip Ganda | 0x0007 | 0x0034 | 0x0028 | 41 |
Keyboard/Keypad | Aksen Keyboard Grave dan Tilde | 0x0007 | 0x0035 | 0x0029 | 1 |
Keyboard/Keypad | Koma Keyboard | 0x0007 | 0x0036 | 0x0033 | 53 |
Keyboard/Keypad | Periode Keyboard | 0x0007 | 0x0037 | 0x0034 | 54 |
Keyboard/Keypad | Tanda Tanya Keyboard | 0x0007 | 0x0038 | 0x0035 | 55 |
Keyboard/Keypad | Kunci Tutup Papan Tombol | 0x0007 | 0x0039 | 0x003A | 30 |
Keyboard/Keypad | Keyboard F1 | 0x0007 | 0x003A | 0x003B | 112 |
Keyboard/Keypad | Keyboard F2 | 0x0007 | 0x003B | 0x003C | 113 |
Keyboard/Keypad | Keyboard F3 | 0x0007 | 0x003C | 0x003D | 114 |
Keyboard/Keypad | Keyboard F4 | 0x0007 | 0x003D | 0x003E | 115 |
Keyboard/Keypad | Keyboard F5 | 0x0007 | 0x003E | 0x003F | 116 |
Keyboard/Keypad | Keyboard F6 | 0x0007 | 0x003F | 0x0040 | 117 |
Keyboard/Keypad | Keyboard F7 | 0x0007 | 0x0040 | 0x0041 | 118 |
Keyboard/Keypad | Keyboard F8 | 0x0007 | 0x0041 | 0x0042 | 119 |
Keyboard/Keypad | Keyboard F9 | 0x0007 | 0x0042 | 0x0043 | 120 |
Keyboard/Keypad | Keyboard F10 | 0x0007 | 0x0043 | 0x0044 | 121 |
Keyboard/Keypad | Keyboard F11 | 0x0007 | 0x0044 | 0x0057 | 122 |
Keyboard/Keypad | Keyboard F12 | 0x0007 | 0x0045 | 0x0058 | 123 |
Keyboard/Keypad | Layar Cetak Keyboard | 0x0007 | 0x0046 | 0xE037 0x0054 *Catatan 1 |
124 |
Keyboard/Keypad | Kunci Gulir Keyboard | 0x0007 | 0x0047 | 0x0046 | 125 |
Keyboard/Keypad | Jeda Keyboard | 0x0007 | 0x0048 | 0xE11D45 0xE046 *Catatan 2 0x0045 *Catatan 3 |
126 |
Keyboard/Keypad | Sisipkan Keyboard | 0x0007 | 0x0049 | 0xE052 | 75 |
Keyboard/Keypad | Beranda Keyboard | 0x0007 | 0x004A | 0xE047 | 80 |
Keyboard/Keypad | Keyboard PageUp | 0x0007 | 0x004B | 0xE049 | 85 |
Keyboard/Keypad | Penghapusan Keyboard Teruskan | 0x0007 | 0x004C | 0xE053 | 76 |
Keyboard/Keypad | Akhir Keyboard | 0x0007 | 0x004D | 0xE04F | 81 |
Keyboard/Keypad | Halaman Papan TombolUnduh | 0x0007 | 0x004E | 0xE051 | 86 |
Keyboard/Keypad | Keyboard RightArrow | 0x0007 | 0x004F | 0xE04D | 89 |
Keyboard/Keypad | Keyboard LeftArrow | 0x0007 | 0x0050 | 0xE04B | 79 |
Keyboard/Keypad | Keyboard DownArrow | 0x0007 | 0x0051 | 0xE050 | 84 |
Keyboard/Keypad | Keyboard UpArrow | 0x0007 | 0x0052 | 0xE048 | 83 |
Keyboard/Keypad | Keypad Num Lock dan Clear | 0x0007 | 0x0053 | 0x0045 0xE045 *Catatan 3 |
90 |
Keyboard/Keypad | Garis Miring Keypad | 0x0007 | 0x0054 | 0xE035 | 95 |
Keyboard/Keypad | Bintang Keypad | 0x0007 | 0x0055 | 0x0037 | 100 |
Keyboard/Keypad | Garis Putus Keypad | 0x0007 | 0x0056 | 0x004A | 105 |
Keyboard/Keypad | Keypad Plus | 0x0007 | 0x0057 | 0x004E | 106 |
Keyboard/Keypad | Keypad ENTER | 0x0007 | 0x0058 | 0xE01C | 108 |
Keyboard/Keypad | Keypad 1 dan End | 0x0007 | 0x0059 | 0x004F | 93 |
Keyboard/Keypad | Keypad 2 dan Panah Bawah | 0x0007 | 0x005A | 0x0050 | 98 |
Keyboard/Keypad | Keypad 3 dan PageDn | 0x0007 | 0x005B | 0x0051 | 103 |
Keyboard/Keypad | Keypad 4 dan Panah Kiri | 0x0007 | 0x005C | 0x004B | 92 |
Keyboard/Keypad | Keypad 5 | 0x0007 | 0x005D | 0x004C | 97 |
Keyboard/Keypad | Keypad 6 dan Panah Kanan | 0x0007 | 0x005E | 0x004D | 102 |
Keyboard/Keypad | Keypad 7 dan Home | 0x0007 | 0x005F | 0x0047 | 91 |
Keyboard/Keypad | Keypad 8 dan Panah Atas | 0x0007 | 0x0060 | 0x0048 | 96 |
Keyboard/Keypad | Keypad 9 dan PageUp | 0x0007 | 0x0061 | 0x0049 | 101 |
Keyboard/Keypad | Keypad 0 dan Sisipkan | 0x0007 | 0x0062 | 0x0052 | 99 |
Keyboard/Keypad | Periode Keypad | 0x0007 | 0x0063 | 0x0053 | 104 |
Keyboard/Keypad | Bilah Garis Miring Non-AS Keyboard | 0x0007 | 0x0064 | 0x0056 | 45 |
Keyboard/Keypad | Aplikasi Keyboard | 0x0007 | 0x0065 | 0xE05D | 129 |
Keyboard/Keypad | Daya Keyboard | 0x0007 | 0x0066 | 0xE05E | |
Keyboard/Keypad | Keypad Sama dengan | 0x0007 | 0x0067 | 0x0059 | |
Keyboard/Keypad | Keyboard F13 | 0x0007 | 0x0068 | 0x0064 | |
Keyboard/Keypad | Keyboard F14 | 0x0007 | 0x0069 | 0x0065 | |
Keyboard/Keypad | Keyboard F15 | 0x0007 | 0x006A | 0x0066 | |
Keyboard/Keypad | Keyboard F16 | 0x0007 | 0x006B | 0x0067 | |
Keyboard/Keypad | Keyboard F17 | 0x0007 | 0x006C | 0x0068 | |
Keyboard/Keypad | Keyboard F18 | 0x0007 | 0x006D | 0x0069 | |
Keyboard/Keypad | Keyboard F19 | 0x0007 | 0x006E | 0x006A | |
Keyboard/Keypad | Keyboard F20 | 0x0007 | 0x006F | 0x006B | |
Keyboard/Keypad | Keyboard F21 | 0x0007 | 0x0070 | 0x006C | |
Keyboard/Keypad | Keyboard F22 | 0x0007 | 0x0071 | 0x006D | |
Keyboard/Keypad | Keyboard F23 | 0x0007 | 0x0072 | 0x006E | |
Keyboard/Keypad | Keyboard F24 | 0x0007 | 0x0073 | 0x0076 | |
Keyboard/Keypad | Keypad Koma | 0x0007 | 0x0085 | 0x007E | 107 *Catatan 4 |
Keyboard/Keypad | Keyboard International1 | 0x0007 | 0x0087 | 0x0073 | 56 *Catatan 4, 5 |
Keyboard/Keypad | Keyboard International2 | 0x0007 | 0x0088 | 0x0070 | 133 *Catatan 5 |
Keyboard/Keypad | Keyboard International3 | 0x0007 | 0x0089 | 0x007D | 14 *Catatan 5 |
Keyboard/Keypad | Keyboard International4 | 0x0007 | 0x008A | 0x0079 | 132 *Catatan 5 |
Keyboard/Keypad | Keyboard International5 | 0x0007 | 0x008B | 0x007B | 131 *Catatan 5 |
Keyboard/Keypad | Keyboard International6 | 0x0007 | 0x008C | 0x005C | |
Keyboard/Keypad | Keyboard LANG1 | 0x0007 | 0x0090 | 0x0072 *Catatan 6 0x00F2 *Catatan 3, 6 |
|
Keyboard/Keypad | Keyboard LANG2 | 0x0007 | 0x0091 | 0x0071 *Catatan 6 0x00F1 *Catatan 3, 6 |
|
Keyboard/Keypad | Keyboard LANG3 | 0x0007 | 0x0092 | 0x0078 | |
Keyboard/Keypad | Keyboard LANG4 | 0x0007 | 0x0093 | 0x0077 | |
Keyboard/Keypad | Keyboard LANG5 | 0x0007 | 0x0094 | 0x0076 | |
Keyboard/Keypad | Keyboard LeftControl | 0x0007 | 0x00E0 | 0x001D | 58 |
Keyboard/Keypad | Keyboard LeftShift | 0x0007 | 0x00E1 | 0x002A | 44 |
Keyboard/Keypad | Keyboard KiriAlt | 0x0007 | 0x00E2 | 0x0038 | 60 |
Keyboard/Keypad | GUI Kiri Keyboard | 0x0007 | 0x00E3 | 0xE05B | 127 |
Keyboard/Keypad | Keyboard RightControl | 0x0007 | 0x00E4 | 0xE01D | 64 |
Keyboard/Keypad | Keyboard RightShift | 0x0007 | 0x00E5 | 0x0036 | 57 |
Keyboard/Keypad | Keyboard KananAlt | 0x0007 | 0x00E6 | 0xE038 | 62 |
Keyboard/Keypad | GUI Kanan Keyboard | 0x0007 | 0x00E7 | 0xE05C | 128 |
Konsumen | Pindai Trek Berikutnya | 0x000C | 0x00B5 | 0xE019 | |
Konsumen | Pindai Trek Sebelumnya | 0x000C | 0x00B6 | 0xE010 | |
Konsumen | Stop | 0x000C | 0x00B7 | 0xE024 | |
Konsumen | Putar/Jeda | 0x000C | 0x00CD | 0xE022 | |
Konsumen | Matikan Suara | 0x000C | 0x00E2 | 0xE020 | |
Konsumen | Kenaikan Volume | 0x000C | 0x00E9 | 0xE030 | |
Konsumen | Penurunan Volume | 0x000C | 0x00EA | 0xE02E | |
Konsumen | Konfigurasi Kontrol Konsumen AL | 0x000C | 0x0183 | 0xE06D | |
Konsumen | Pembaca Email AL | 0x000C | 0x018A | 0xE06C | |
Konsumen | Kalkulator AL | 0x000C | 0x0192 | 0xE021 | |
Konsumen | Browser Komputer Lokal AL | 0x000C | 0x0194 | 0xE06B | |
Konsumen | Pencarian AC | 0x000C | 0x0221 | 0xE065 | |
Konsumen | Beranda AC | 0x000C | 0x0223 | 0xE032 | |
Konsumen | AC Back | 0x000C | 0x0224 | 0xE06A | |
Konsumen | AC Forward | 0x000C | 0x0225 | 0xE069 | |
Konsumen | Perhentian AC | 0x000C | 0x0226 | 0xE068 | |
Konsumen | Penyegaran AC | 0x000C | 0x0227 | 0xE067 | |
Konsumen | Marka Buku AC | 0x000C | 0x022A | 0xE066 |
Catatan:
- Kode pemindaian kunci SysRq dipancarkan pada penekanan tombol layar Alt+Print
- Kode pemindaian kunci pemutus dipancarkan pada Control+Jeda penekanan tombol
- Seperti yang terlihat dalam pesan keyboard warisan
- Kuncinya ada di keyboard Brasil
- Kuncinya ada di keyboard Jepang
- Kode pemindaian hanya dipancarkan dalam peristiwa rilis kunci
Bendera Kunci Diperluas
Bendera kunci yang diperluas menunjukkan apakah pesan penekanan tombol berasal dari salah satu tombol tambahan pada keyboard tombol 101/102 yang ditingkatkan. Tombol yang diperluas terdiri dari tombol ALT dan CTRL di sisi kanan keyboard; tombol INS, DEL, HOME, END, PAGE UP, PAGE DOWN, dan panah di kluster di sebelah kiri keypad numerik; kunci NUM LOCK; tombol BREAK (CTRL+PAUSE) ; tombol PRINT SCRN; dan tombol bagi (/) dan ENTER di keypad numerik. Kunci SHIFT sebelah kanan tidak dianggap sebagai kunci yang diperluas, kunci tersebut memiliki kode pemindaian terpisah sebagai gantinya.
Jika ditentukan, kode pemindaian terdiri dari urutan dua byte, di mana byte pertama memiliki nilai 0xE0.
Kode Konteks
Kode konteks menunjukkan apakah kunci ALT tidak berfungsi saat pesan penekanan tombol dibuat. Kodenya adalah 1 jika kunci ALT tidak berfungsi dan 0 jika sudah naik.
Bendera Status Kunci Sebelumnya
Bendera status kunci sebelumnya menunjukkan apakah kunci yang menghasilkan pesan penekanan tombol sebelumnya naik atau turun. Ini adalah 1 jika kunci sebelumnya tidak berfungsi dan 0 jika kunci sebelumnya naik. Anda dapat menggunakan bendera ini untuk mengidentifikasi pesan penekanan tombol yang dihasilkan oleh fitur pengulangan otomatis keyboard. Bendera ini diatur ke 1 untuk pesan penekanan kunci WM_KEYDOWN dan WM_SYSKEYDOWN yang dihasilkan oleh fitur pengulangan otomatis. Ini selalu diatur ke 1 untuk pesan WM_KEYUP dan WM_SYSKEYUP.
Bendera Status Transisi
Bendera status transisi menunjukkan apakah menekan tombol atau merilis kunci yang menghasilkan pesan penekanan tombol. Bendera ini selalu diatur ke 0 untuk pesan WM_KEYDOWN dan WM_SYSKEYDOWN; selalu diatur ke 1 untuk pesan WM_KEYUP dan WM_SYSKEYUP.
Pesan Karakter
Pesan keystroke memberikan banyak informasi tentang penekanan tombol, tetapi tidak menyediakan kode karakter untuk penekanan kunci karakter. Untuk mengambil kode karakter, aplikasi harus menyertakan fungsi TranslateMessage dalam perulangan pesan utasnya. TranslateMessage meneruskan pesan WM_KEYDOWN atau WM_SYSKEYDOWN ke tata letak keyboard. Tata letak memeriksa kode kunci virtual pesan dan, jika sesuai dengan kunci karakter, menyediakan kode karakter yang setara (dengan mempertimbangkan status tombol SHIFT dan CAPS LOCK). Kemudian menghasilkan pesan karakter yang menyertakan kode karakter dan menempatkan pesan di bagian atas antrean pesan. Perulangan pesan berikutnya menghapus pesan karakter dari antrean dan mengirimkan pesan ke prosedur jendela yang sesuai.
Bagian ini membahas topik-topik berikut:
Pesan Karakter Nonsystem
Prosedur jendela dapat menerima pesan karakter berikut: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHAR, dan WM_UNICHAR. Fungsi TranslateMessage menghasilkan pesan WM_CHAR atau WM_DEADCHAR saat memproses pesan WM_KEYDOWN. Demikian pula, ini menghasilkan pesan WM_SYSCHAR atau WM_SYSDEADCHAR saat memproses pesan WM_SYSKEYDOWN .
Aplikasi yang memproses input keyboard biasanya mengabaikan semua kecuali pesan WM_CHAR dan WM_UNICHAR, meneruskan pesan lain ke fungsi DefWindowProc. Perhatikan bahwa WM_CHAR menggunakan UTF-16 (Format Transformasi Unicode 16-bit) atau set karakter ANSI sementara WM_UNICHAR selalu menggunakan UTF-32 (Format Transformasi Unicode 32-bit). Sistem menggunakan pesan WM_SYSCHAR dan WM_SYSDEADCHAR untuk mengimplementasikan mnemonik menu.
Parameter wParam dari semua pesan karakter berisi kode karakter tombol karakter yang ditekan. Nilai kode karakter tergantung pada kelas jendela jendela yang menerima pesan. Jika versi Unicode dari fungsi RegisterClass digunakan untuk mendaftarkan kelas jendela, sistem menyediakan karakter Unicode ke semua jendela kelas tersebut. Jika tidak, sistem menyediakan kode karakter ANSI. Untuk informasi selengkapnya, lihat Mendaftarkan Kelas Jendela dan Menggunakan halaman kode UTF-8 di aplikasi Windows.
Konten parameter lParam dari pesan karakter identik dengan konten parameter lParam dari pesan key-down yang diterjemahkan untuk menghasilkan pesan karakter. Untuk informasi, lihat Bendera Pesan Keystroke.
Pesan Karakter Mati
Beberapa keyboard non-Bahasa Inggris berisi tombol karakter yang tidak diharapkan untuk menghasilkan karakter sendiri. Sebaliknya, mereka digunakan untuk menambahkan diakritik ke karakter yang dihasilkan oleh penekanan tombol berikutnya. Kunci ini disebut kunci mati. Tombol sirkumfleks pada keyboard Jerman adalah contoh tombol mati. Untuk memasukkan karakter yang terdiri dari "o" dengan sirkumfleks, pengguna Jerman akan mengetikkan kunci sirkumfleks diikuti dengan kunci "o". Jendela dengan fokus keyboard akan menerima urutan pesan berikut:
TranslateMessage menghasilkan pesan WM_DEADCHAR saat memproses pesan WM_KEYDOWN dari kunci mati. Meskipun parameter wParam dari pesan WM_DEADCHAR berisi kode karakter diakritik untuk kunci mati, aplikasi biasanya mengabaikan pesan. Sebaliknya, ia memproses pesan WM_CHAR yang dihasilkan oleh penekanan tombol berikutnya. Parameter wParam dari pesan WM_CHAR berisi kode karakter huruf dengan diakritik. Jika penekanan kunci berikutnya menghasilkan karakter yang tidak dapat dikombinasikan dengan diakritik, sistem menghasilkan dua pesan WM_CHAR . Parameter wParam dari yang pertama berisi kode karakter diakritik; parameter wParam dari yang kedua berisi kode karakter kunci karakter berikutnya.
Fungsi TranslateMessage menghasilkan pesan WM_SYSDEADCHAR saat memproses pesan WM_SYSKEYDOWN dari tombol mati sistem (tombol mati yang ditekan dalam kombinasi dengan tombol ALT). Aplikasi biasanya mengabaikan pesan WM_SYSDEADCHAR .
Status Kunci
Saat memproses pesan keyboard, aplikasi mungkin perlu menentukan status kunci lain selain yang menghasilkan pesan saat ini. Misalnya, aplikasi pemrosesan kata yang memungkinkan pengguna menekan SHIFT+END untuk memilih blok teks harus memeriksa status tombol SHIFT setiap kali menerima pesan penekanan tombol dari tombol END. Aplikasi dapat menggunakan fungsi GetKeyState untuk menentukan status kunci virtual pada saat pesan saat ini dibuat; aplikasi dapat menggunakan fungsi GetAsyncKeyState untuk mengambil status kunci virtual saat ini.
Tata letak keyboard mempertahankan daftar nama. Nama kunci yang menghasilkan satu karakter sama dengan karakter yang dihasilkan oleh kunci. Nama kunci noncharacter seperti TAB dan ENTER disimpan sebagai string karakter. Aplikasi dapat mengambil nama kunci apa pun dari driver perangkat dengan memanggil fungsi GetKeyNameText.
Penekanan Tombol dan Terjemahan Karakter
Sistem ini mencakup beberapa fungsi tujuan khusus yang menerjemahkan kode pemindaian, kode karakter, dan kode kunci virtual yang disediakan oleh berbagai pesan penekanan kunci. Fungsi-fungsi ini termasuk MapVirtualKey, ToAscii, ToUnicode, dan VkKeyScan.
Selain itu, Microsoft Rich Edit 3.0 mendukung IME HexToUnicode, yang memungkinkan pengguna untuk mengonversi antara karakter heksadesimal dan Unicode dengan menggunakan tombol panas. Ini berarti bahwa ketika Microsoft Rich Edit 3.0 dimasukkan ke dalam aplikasi, aplikasi akan mewarisi fitur IME HexToUnicode.
Dukungan Hot-Key
Kunci panas adalah kombinasi kunci yang menghasilkan pesan WM_HOTKEY, pesan yang ditempat sistem di bagian atas antrean pesan utas, melewati pesan yang ada dalam antrean. Aplikasi menggunakan tombol panas untuk mendapatkan input keyboard berprioritas tinggi dari pengguna. Misalnya, dengan menentukan hot key yang terdiri dari kombinasi kunci CTRL+C, aplikasi dapat memungkinkan pengguna untuk membatalkan operasi yang panjang.
Untuk menentukan hot key, aplikasi memanggil fungsi RegisterHotKey, menentukan kombinasi kunci yang menghasilkan pesan WM_HOTKEY, handel ke jendela untuk menerima pesan, dan pengidentifikasi kunci panas. Saat pengguna menekan tombol panas, pesan WM_HOTKEY ditempatkan dalam antrean pesan utas yang membuat jendela. Parameter wParam pesan berisi pengidentifikasi kunci panas. Aplikasi dapat menentukan beberapa hot key untuk utas, tetapi setiap kunci panas di utas harus memiliki pengidentifikasi unik. Sebelum aplikasi berakhir, aplikasi harus menggunakan fungsi UnregisterHotKey untuk menghancurkan kunci panas.
Aplikasi dapat menggunakan kontrol kunci panas untuk memudahkan pengguna memilih hot key. Kontrol hot key biasanya digunakan untuk menentukan hot key yang mengaktifkan jendela; mereka tidak menggunakan fungsi RegisterHotKey dan UnregisterHotKey. Sebagai gantinya, aplikasi yang menggunakan kontrol hot key biasanya mengirim pesan WM_SETHOTKEY untuk mengatur hot key. Setiap kali pengguna menekan tombol panas, sistem mengirim pesan WM_SYSCOMMAND yang menentukan SC_HOTKEY. Untuk informasi selengkapnya tentang kontrol hot key, lihat "Menggunakan Kontrol Hot Key" di Kontrol Hot Key.
Tombol Keyboard untuk Penjelajahan dan Fungsi Lainnya
Windows menyediakan dukungan untuk keyboard dengan kunci khusus untuk fungsi browser, fungsi media, peluncuran aplikasi, dan manajemen daya. WM_APPCOMMAND mendukung tombol keyboard tambahan. Selain itu, fungsi ShellProc dimodifikasi untuk mendukung tombol keyboard tambahan.
Tidak mungkin jendela anak dalam aplikasi komponen akan dapat langsung mengimplementasikan perintah untuk tombol keyboard tambahan ini. Jadi ketika salah satu tombol ini ditekan, DefWindowProc akan mengirim pesan WM_APPCOMMAND ke jendela. DefWindowProc juga akan menggelembungkan pesan WM_APPCOMMAND ke jendela induknya. Ini mirip dengan cara menu konteks dipanggil dengan tombol kanan mouse, yaitu DefWindowProc mengirim pesan WM_CONTEXTMENU pada klik tombol kanan, dan menggelegakkannya ke induknya. Selain itu, jika DefWindowProc menerima pesan WM_APPCOMMAND untuk jendela tingkat atas, itu akan memanggil hook shell dengan kode HSHELL_APPCOMMAND.
Windows juga mendukung Microsoft IntelliMouse Explorer, yang merupakan mouse dengan lima tombol. Dua tombol tambahan mendukung navigasi browser maju dan mundur. Untuk informasi selengkapnya, lihat XBUTTON.
Mensimulasikan Input
Untuk menyimulasikan serangkaian peristiwa input pengguna yang tidak terganggu, gunakan fungsi SendInput. Fungsi menerima tiga parameter. Parameter pertama, cInputs, menunjukkan jumlah peristiwa input yang akan disimulasikan. Parameter kedua, rgInputs, adalah array struktur INPUT, masing-masing menjelaskan jenis peristiwa input dan informasi tambahan tentang peristiwa tersebut. Parameter terakhir, cbSize, menerima ukuran struktur INPUT , dalam byte.
Fungsi SendInput berfungsi dengan menyuntikkan serangkaian peristiwa input yang disimulasikan ke dalam aliran input perangkat. Efeknya mirip dengan memanggil fungsi keybd_event atau mouse_event berulang kali, kecuali bahwa sistem memastikan bahwa tidak ada peristiwa input lain yang saling terkait dengan peristiwa yang disimulasikan. Ketika panggilan selesai, nilai pengembalian menunjukkan jumlah peristiwa input yang berhasil diputar. Jika nilai ini nol, maka input diblokir.
Fungsi SendInput tidak mengatur ulang status keyboard saat ini. Oleh karena itu, jika pengguna memiliki tombol yang ditekan saat Anda memanggil fungsi ini, mereka mungkin mengganggu peristiwa yang dihasilkan fungsi ini. Jika Anda khawatir tentang kemungkinan gangguan, periksa status keyboard dengan fungsi GetAsyncKeyState dan koreksi seperlunya.
Bahasa, Lokal, dan Tata Letak Keyboard
Bahasa adalah bahasa alami, seperti Inggris, Prancis, dan Jepang. Sublanguasi adalah varian bahasa alami yang diucapkan di wilayah geografis tertentu, seperti sublanguages bahasa Inggris yang digunakan di Inggris dan Amerika Serikat. Aplikasi menggunakan nilai, yang disebut pengidentifikasi bahasa, untuk mengidentifikasi bahasa dan sublanguages secara unik.
Aplikasi biasanya menggunakan lokal untuk mengatur bahasa tempat input dan output diproses . Mengatur lokal untuk keyboard, misalnya, memengaruhi nilai karakter yang dihasilkan oleh keyboard. Menyetel lokal untuk tampilan atau printer mempengaruhi glyph yang ditampilkan atau dicetak. Aplikasi mengatur lokal untuk keyboard dengan memuat dan menggunakan tata letak keyboard. Mereka mengatur lokal untuk tampilan atau printer dengan memilih font yang mendukung lokal yang ditentukan.
Tata letak keyboard tidak hanya menentukan posisi fisik tombol pada keyboard tetapi juga menentukan nilai karakter yang dihasilkan dengan menekan tombol tersebut. Setiap tata letak mengidentifikasi bahasa input saat ini dan menentukan nilai karakter mana yang dihasilkan oleh kunci dan kombinasi kunci.
Setiap tata letak keyboard memiliki handel yang sesuai yang mengidentifikasi tata letak dan bahasa. Kata rendah handel adalah pengidentifikasi bahasa. Kata tinggi adalah handel perangkat, menentukan tata letak fisik, atau nol, menunjukkan tata letak fisik default. Pengguna dapat mengaitkan bahasa input apa pun dengan tata letak fisik. Misalnya, pengguna berbahasa Inggris yang kadang-kadang bekerja dalam bahasa Prancis dapat mengatur bahasa input keyboard ke bahasa Prancis tanpa mengubah tata letak fisik keyboard. Ini berarti pengguna dapat memasukkan teks dalam bahasa Prancis menggunakan tata letak bahasa Inggris yang familier.
Aplikasi umumnya tidak diharapkan untuk memanipulasi bahasa input secara langsung. Sebagai gantinya, pengguna menyiapkan kombinasi bahasa dan tata letak, lalu beralih di antara mereka. Ketika pengguna mengklik teks yang ditandai dengan bahasa yang berbeda, aplikasi memanggil fungsi ActivateKeyboardLayout untuk mengaktifkan tata letak default pengguna untuk bahasa tersebut. Jika pengguna mengedit teks dalam bahasa yang tidak ada dalam daftar aktif, aplikasi dapat memanggil fungsi LoadKeyboardLayout dengan bahasa untuk mendapatkan tata letak berdasarkan bahasa tersebut.
Fungsi ActivateKeyboardLayout mengatur bahasa input untuk tugas saat ini. Parameter hkl dapat berupa handel ke tata letak keyboard atau pengidentifikasi bahasa yang diperluas nol. Handel tata letak keyboard dapat diperoleh dari fungsi LoadKeyboardLayout atau GetKeyboardLayoutList. Nilai HKL_NEXT dan HKL_PREV juga dapat digunakan untuk memilih keyboard berikutnya atau sebelumnya.
Fungsi GetKeyboardLayoutName mengambil nama tata letak keyboard aktif untuk utas panggilan. Jika aplikasi membuat tata letak aktif menggunakan fungsi LoadKeyboardLayout , GetKeyboardLayoutName mengambil string yang sama yang digunakan untuk membuat tata letak. Jika tidak, string adalah pengidentifikasi bahasa utama yang sesuai dengan lokal tata letak aktif. Ini berarti fungsi mungkin belum tentu membedakan antara tata letak yang berbeda dengan bahasa utama yang sama, jadi tidak dapat mengembalikan informasi spesifik tentang bahasa input. Namun , fungsi GetKeyboardLayout dapat digunakan untuk menentukan bahasa input.
Fungsi LoadKeyboardLayout memuat tata letak keyboard dan membuat tata letak tersedia untuk pengguna. Aplikasi dapat membuat tata letak segera aktif untuk utas saat ini dengan menggunakan nilai KLF_ACTIVATE . Aplikasi dapat menggunakan nilai KLF_REORDER untuk menyusun ulang tata letak tanpa juga menentukan nilai KLF_ACTIVATE . Aplikasi harus selalu menggunakan nilai KLF_SUBSTITUTE_OK saat memuat tata letak keyboard untuk memastikan bahwa preferensi pengguna, jika ada, dipilih.
Untuk dukungan multibahasa, fungsi LoadKeyboardLayout menyediakan bendera KLF_REPLACELANG dan KLF_NOTELLSHELL . Bendera KLF_REPLACELANG mengarahkan fungsi untuk mengganti tata letak keyboard yang ada tanpa mengubah bahasa. Mencoba mengganti tata letak yang ada menggunakan pengidentifikasi bahasa yang sama tetapi tanpa menentukan KLF_REPLACELANG adalah kesalahan. Bendera KLF_NOTELLSHELL mencegah fungsi memberi tahu shell saat tata letak keyboard ditambahkan atau diganti. Ini berguna untuk aplikasi yang menambahkan beberapa tata letak dalam serangkaian panggilan berturut-turut. Bendera ini harus digunakan di semua kecuali panggilan terakhir.
Fungsi UnloadKeyboardLayout dibatasi karena tidak dapat membongkar bahasa input default sistem. Ini memastikan bahwa pengguna selalu memiliki satu tata letak yang tersedia untuk memasukkan teks menggunakan set karakter yang sama seperti yang digunakan oleh shell dan sistem file.