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.

keyboard input processing model

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 .

the locations of the flags and values in the lparam parameter of a keystroke message

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

Diagram of a Type 4 keyboard with the key locations for each key.

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 сodes 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:

  1. Kode pemindaian kunci SysRq dipancarkan pada penekanan tombol layar Alt+Print
  2. Kode pemindaian kunci pemutus dimunculkan pada Control+Pause keystroke
  3. Seperti yang terlihat dalam pesan keyboard warisan
  4. Kuncinya ada di keyboard Brasil
  5. Kuncinya ada di keyboard Jepang
  6. Kode pemindaian dimunculkan hanya 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:

  1. WM_KEYDOWN
  2. WM_DEADCHAR
  3. WM_KEYUP
  4. WM_KEYDOWN
  5. WM_CHAR
  6. WM_KEYUP

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.