Bagikan melalui


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.

Model Masukan Keyboard

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.

Setiap tombol pada keyboard diberi nilai unik yang disebut kode pemindaian , yang merupakan pengidentifikasi tergantung perangkat untuk tombol tersebut. 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 menunjukkan model input keyboard.

model pemrosesan input keyboard

Fokus dan Aktivasi Keyboard

Sistem memposting pesan papan ketik ke antrean pesan dari utas latar depan yang membuat jendela dengan fokus papan ketik. fokus keyboard adalah sifat sementara dari sebuah 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 akan menerima semua pesan keyboard (dari antrian pesan utas yang membuatnya) hingga fokus tersebut bergeser ke jendela lain.

Utas dapat memanggil fungsiGetFocusuntuk 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 saat ini digunakan pengguna. Jendela dengan fokus keyboard adalah jendela aktif, atau merupakan jendela turunan 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. Sebuah utas dapat mengaktifkan jendela tingkat atas dengan menggunakan fungsi SetActiveWindow. Ini dapat menentukan apakah jendela tingkat atas yang dibuatnya aktif dengan menggunakan fungsiGetActiveWindow.

Ketika satu jendela dinonaktifkan dan satu lagi diaktifkan, sistem mengirim pesan WM_ACTIVATE. Kata berurutan rendah dari parameter wParam adalah nol jika jendela dinonaktifkan dan bukan nol jika 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 fungsiSendInput saat input diblokir akan mengubah tabel status input keyboard asinkron.

Pesan Keystroke

Menekan tombol mengakibatkan pesan WM_KEYDOWN atau WM_SYSKEYDOWN ditempatkan dalam antrean pesan utas yang dilampirkan ke jendela yang memiliki fokus keyboard. Melepaskan tombol menyebabkan pesan WM_KEYUP atau WM_SYSKEYUP dimasukkan dalam antrian.

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 berikut:

Penekanan Tombol Sistem dan Nonsistem

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 tombol dalam kombinasi dengan tombol ALT, atau ketika pengguna mengetik dan tidak ada jendela yang memiliki fokus keyboard (misalnya, ketika aplikasi yang aktif diminimalkan). Dalam hal ini, pesan diposting ke antrean pesan yang dilampirkan ke jendela aktif.

Pesan penekanan kunci nonsystem digunakan oleh jendela aplikasi; fungsiDefWindowProc tidak melakukan apa pun dengan pesan-pesan tersebut. Prosedur jendela dapat membuang pesan penekanan kunci nonsstem yang tidak diperlukan.

Kode Virtual-Key Dijelaskan

Parameter wParam dari pesan penekanan tombol berisi kode tombol virtual dari tombol 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 kunci, 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 tombol dari tombol karakter. Sebagai gantinya, ia menggunakan fungsiTranslateMessage untuk mengonversi pesan menjadi pesan karakter. Untuk informasi selengkapnya tentang TranslateMessage dan pesan karakter, lihat pesan karakter .

Bendera Pesan Penekanan Tombol

Parameter lParam dari pesan keystroke mengandung informasi tambahan tentang keystroke yang menghasilkan pesan. Informasi ini mencakup jumlah pengulangan , kode pemindaian , bendera kunci diperluas , kode konteks , bendera status kunci sebelumnya , dan bendera status transisi . Ilustrasi berikut menunjukkan lokasi bendera dan nilai ini dalam parameter lParam.

lokasi bendera dan nilai dalam parameter lparam dari pesan penekanan kunci

Aplikasi dapat menggunakan nilai berikut untuk mendapatkan bendera penekanan tombol dari kata paling signifikan lParam.

Nilai Deskripsi
KF_EXTENDED
0x0100
Memanipulasi bendera kunci 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 penanda 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 Pengulangan

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. Daripada mengisi antrean pesan sistem dengan pesan penekanan tombol yang dihasilkan, sistem menggabungkan pesan-pesan tersebut menjadi satu pesan penekanan tombol 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 keyboard Tipe 4 dengan lokasi kunci untuk setiap tombol.

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, bukan 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 Human Interface Devices (HID) untuk berkomunikasi dengan komputer. Driver keyboard mengonversi nilai Penggunaan HID yang dilaporkan, yang dikirim dari keyboard menjadi kode pemindaian, lalu meneruskannya ke aplikasi.

Nota

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, pemetaan tombol WASD (W adalah atas, A adalah kiri, S adalah bawah, dan D adalah kanan) untuk game, yang memastikan formasi tombol yang konsisten di US QWERTY atau tata letak keyboard Prancis AZERTY.

Tabel berikut mencantumkan kumpulan Kode Pemindaian seperti yang saat ini dikenali oleh Windows. Halaman Penggunaan HID/ID Penggunaan HID/Nama Penggunaan HID mengacu pada dokumen Tabel Penggunaan HID. Nilai Lokasi Kunci mengacu pada gambar keyboard sebelumnya.

Kode Scan 1 Make dikirimkan dalam pesan WM_KEYDOWN/WM_KEYUP/WM_SYSKEYDOWN/WM_SYSKEYUP dan WM_INPUT.

Nama Halaman Penggunaan HID Nama Penggunaan HID Halaman Penggunaan HID ID Penggunaan HID Pindai 1 Mulai Lokasi Kunci
Desktop Generik Penghentian Daya Sistem 0x0001 0x0081 0xE05E
Desktop Generik Sistem Tidur 0x0001 0x0082 0xE05F
Generik Desktop Sistem Bangun 0x0001 0x0083 0xE063
Papan Ketik/Tombol Numpad ErrorRollOver 0x0007 0x0001 0x00FF
Papan Ketik/Keypad numerik Papan Ketik A 0x0007 0x0004 0x001E 31
Papan Ketik/Tombol Numerik Papan Ketik B 0x0007 0x0005 0x0030 50
Papan Ketik/Papan Tombol Papan Ketik C 0x0007 0x0006 0x002E 48
Papan Ketik/Pad Ketik Papan Ketik D 0x0007 0x0007 0x0020 33
Papan Ketik/Tombol Papan Num Keyboard E 0x0007 0x0008 0x0012 19
Papan Ketik/Papan Tombol Keyboard F 0x0007 0x0009 0x0021 34
Papan Ketik/Papan Tombol Keyboard G 0x0007 0x000A 0x0022 35
Keyboard/Keypad Keyboard H 0x0007 0x000B 0x0023 36
Papan Ketik/Keypad Papan Ketik I 0x0007 0x000C 0x0017 24
Papan Ketik/Keypad Papan Ketik J 0x0007 0x000D 0x0024 37
Papan Ketik/Tombol Angka Keyboard K 0x0007 0x000E 0x0025 38
Papan Ketik/Tombol Angka Keyboard L 0x0007 0x000F 0x0026 39
Papan Ketik/Tombol Numpad Papan Ketik M 0x0007 0x0010 0x0032 52
Papan Ketik/Panel Tombol Papan Ketik N 0x0007 0x0011 0x0031 51
Papan Ketik/Tuts Papan Ketik O 0x0007 0x0012 0x0018 25
Papan Ketik/Tuts Papan Ketik P 0x0007 0x0013 0x0019 26
Papan Ketik/Papan Tombol Keyboard Q 0x0007 0x0014 0x0010 17
Papan Ketik/Papan Tombol Keyboard R 0x0007 0x0015 0x0013 20
Papan Ketik/Tombol Nomor Keyboard S 0x0007 0x0016 0x001F 32
Keyboard/Keypad Papan Ketik T 0x0007 0x0017 0x0014 21
Papan Ketik/Papan Tombol Papan Ketik 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
Papan Ketik/Papan Tombol Keyboard Z 0x0007 0x001D 0x002C 46
Keyboard/Keypad Keyboard 1 dan Bang 0x0007 0x001E 0x0002 2
Papan Ketik/Pad Ketik Keyboard 2 dan At 0x0007 0x001F 0x0003 3
Papan Ketik/Papan Tombol Keyboard 3 dan Tanda Pagar 0x0007 0x0020 0x0004 4
Papan Ketik/Papan Tombol Keyboard 4 dan Dolar 0x0007 0x0021 0x0005 5
Papan Ketik/Tombol Angka Keyboard 5 dan Persen 0x0007 0x0022 0x0006 6
Papan Ketik/Papan Tombol Keyboard 6 dan Caret 0x0007 0x0023 0x0007 7
Papan Ketik/Tombol Angka Keyboard 7 dan Ampersand 0x0007 0x0024 0x0008 8
Papan Ketik/Keypad Keyboard 8 dan Bintang 0x0007 0x0025 0x0009 9
Papan Ketik/Tombol Papan Tombol 9 dan Tanda Kurung Kiri 0x0007 0x0026 0x000A 10
Papan Ketik/Tuts Tombol Keyboard 0 dan Kurung Siku Kanan 0x0007 0x0027 0x000B 11
Papan Ketik/Papan Tombol Keyboard KembaliKan Enter 0x0007 0x0028 0x001C 43
Papan Ketik/Papan Tombol Keyboard Escape 0x0007 0x0029 0x0001 110
Papan Ketik/Keypad Hapus dengan Keyboard 0x0007 0x002A 0x000E 15
Papan Ketik/Tombol Angka Keyboard Tab 0x0007 0x002B 0x000F 16
Keyboard/Keypad Bilah Spasi Papan Ketik 0x0007 0x002C 0x0039 61
Papan Ketik/Papan Tombol Garis Hubung dan Garis Bawah pada Keyboard 0x0007 0x002D 0x000C 12
Papan Ketik/Keypad Keyboard Sama dengan dan Plus 0x0007 0x002E 0x000D 13
Papan Ketik/Papan Tombol Tanda Kurung Kurawal Kiri pada Keyboard 0x0007 0x002F 0x001A 27
Papan Ketik/Pelat Tombol Kurung Kurawal Kanan Keyboard 0x0007 0x0030 0x001B 28
Papan Ketik/Pad Angka Tanda Pipa dan Garis Miring pada Keyboard 0x0007 0x0031 0x002B 29
Papan Ketik/Papan Tombol Keyboard Non-Amerika Serikat 0x0007 0x0032 0x002B 42
Papan Ketik/Papan Tombol Papan Ketik Titik Koma dan Titik Dua 0x0007 0x0033 0x0027 40
Papan Ketik/Tombol Tanda Apostrof dan Tanda Kutip Ganda di Keyboard 0x0007 0x0034 0x0028 41
Papan Ketik/Papan Tombol Aksen Grave dan Tilde pada Keyboard 0x0007 0x0035 0x0029 1
Papan Ketik/Papan Tombol Koma Keyboard 0x0007 0x0036 0x0033 53
Papan Ketik/Papan Tombol Tombol Titik pada Keyboard 0x0007 0x0037 0x0034 54
Papan Ketik/Papan Tombol Keyboard Tanda Tanya 0x0007 0x0038 0x0035 55
Papan Ketik/Tuts Caps Lock 0x0007 0x0039 0x003A 30
Papan Ketik/Papan Tombol Keyboard F1 (Papan Ketik F1) 0x0007 0x003A 0x003B 112
Papan Ketik/Pad Ketik Keyboard F2 0x0007 0x003B 0x003C 113
Papan Ketik/Keypad Keyboard F3 0x0007 0x003C 0x003D 114
Papan Ketik/Papan Tombol Keyboard F4 0x0007 0x003D 0x003E 115
Papan Ketik/Tombol-Numpad Keyboard F5 0x0007 0x003E 0x003F 116
Papan Ketik/Papan Tombol Papan Ketik F6 0x0007 0x003F 0x0040 117
Papan Ketik/Papan Tombol Keyboard F7 0x0007 0x0040 0x0041 118
Papan Ketik/Papan Tombol Keyboard F8 0x0007 0x0041 0x0042 119
Papan Ketik/Tuts Keyboard F9 0x0007 0x0042 0x0043 120
Papan Ketik/NumPad Keyboard F10 0x0007 0x0043 0x0044 121
Papan Ketik/Pad Ketik Keyboard F11 0x0007 0x0044 0x0057 122
Papan Ketik/Tombol Numpad Keyboard F12 0x0007 0x0045 0x0058 123
Papan Ketik/Tombol Layar Cetak Keyboard 0x0007 0x0046 0xE037
0x0054 *Catatan 1
124
Papan Ketik/Papan Tombol Kunci Gulir Keyboard 0x0007 0x0047 0x0046 125
Papan Ketik/Papan Tombol Jeda Keyboard 0x0007 0x0048 0xE11D45
0xE046 *Catatan 2
0x0045 *Catatan 3
126
Papan Ketik/Tombol Papan Sisipkan Keyboard 0x0007 0x0049 0xE052 75
Papan Ketik/Pad Ketik Beranda Keyboard 0x0007 0x004A 0xE047 80
Papan Ketik/Tombol Keyboard PageUp 0x0007 0x004B 0xE049 85
Papan Ketik/Tuts Hapus Maju Keyboard 0x0007 0x004C 0xE053 76
Papan Ketik/Tombol Numpad Tombol End pada Keyboard 0x0007 0x004D 0xE04F 81
Papan Ketik/Keypad Halaman Papan TombolUnduh 0x0007 0x004E 0xE051 86
Keyboard/Keypad Keyboard Panah Kanan 0x0007 0x004F 0xE04D 89
Papan Ketik/Papan Tombol Keyboard LeftArrow 0x0007 0x0050 0xE04B 79
Papan Ketik/Tombol Angka Tombol Panah Bawah 0x0007 0x0051 0xE050 84
Papan Ketik/Papan Tombol Keyboard Panah Atas 0x0007 0x0052 0xE048 83
Papan Ketik/Keypad Tombol Num Lock dan Clear 0x0007 0x0053 0x0045
0xE045 *Catatan 3
90
Papan Ketik/Tombol Angka Keypad Garis Miring 0x0007 0x0054 0xE035 95
Papan Ketik/Pad Tombol Bintang Keypad 0x0007 0x0055 0x0037 100
Papan Ketik/Tombol Pad Tampilan Keypad 0x0007 0x0056 0x004A 105
Papan Ketik/Papan Tombol Keypad Plus 0x0007 0x0057 0x004E 106
Keyboard/Keypad Papan ketik ENTER 0x0007 0x0058 0xE01C 108
Papan Ketik/Pad Ketik Keypad 1 dan End 0x0007 0x0059 0x004F 93
Papan Ketik/Papan Tombol Keypad 2 dan Panah Bawah 0x0007 0x005A 0x0050 98
Keyboard/Papan Ketik Keypad 3 dan PageDn 0x0007 0x005B 0x0051 103
Papan Ketik/Tombol Numerik Keypad 4 dan Panah Kiri 0x0007 0x005C 0x004B 92
Papan Ketik/Tombol Angka Keypad 5 0x0007 0x005D 0x004C 97
Papan Ketik/Keypad Keypad 6 dan Panah Kanan 0x0007 0x005E 0x004D 102
Papan Ketik/Pad Tombol Keypad 7 dan Home 0x0007 0x005F 0x0047 91
Papan Ketik/Tombol Tombol Numpad 8 dan Panah Atas 0x0007 0x0060 0x0048 96
Papan Ketik/Tombol Angka Keypad 9 dan PageUp 0x0007 0x0061 0x0049 101
Papan Ketik/Papan Tombol Keypad 0 dan Sisipkan 0x0007 0x0062 0x0052 99
Papan Ketik/Tombol Periode Pemakaian Keypad 0x0007 0x0063 0x0053 104
Papan Ketik/Tombol Numerik Tombol Garis Miring Non-AS pada Papan Ketik 0x0007 0x0064 0x0056 45
Papan Ketik/Tombol Angka Aplikasi Keyboard 0x0007 0x0065 0xE05D 129
Papan Ketik/Tombol Angka Tenaga Keyboard 0x0007 0x0066 0xE05E
Papan Ketik/Tombol Numerik Keypad Sama dengan 0x0007 0x0067 0x0059
Papan Ketik/Keypad Keyboard F13 0x0007 0x0068 0x0064
Papan Ketik/Tombol Numpad Keyboard F14 0x0007 0x0069 0x0065
Papan Ketik/Papan Tombol Keyboard F15 0x0007 0x006A 0x0066
Papan Ketik/Pad Tombol Keyboard F16 0x0007 0x006B 0x0067
Papan Ketik/Tombol Angka Keyboard F17 0x0007 0x006C 0x0068
Papan Ketik/Tombol Papan Ketik F18 0x0007 0x006D 0x0069
Papan Ketik/Tombol Papan Ketik F19 0x0007 0x006E 0x006A
Papan Ketik/Papan Tombol Keyboard F20 0x0007 0x006F 0x006B
Papan Ketik/Pad Tombol Papan Ketik F21 0x0007 0x0070 0x006C
Papan Ketik/Pad Tombol Keyboard F22 0x0007 0x0071 0x006D
Papan Ketik/Tombol Numerik Papan Ketik F23 0x0007 0x0072 0x006E
Papan Ketik/Papan Tombol Papan Ketik F24 0x0007 0x0073 0x0076
Papan Ketik/Papan Tombol Keypad Koma 0x0007 0x0085 0x007E 107 *Catatan 4
Keyboard/Keypad Keyboard International1 0x0007 0x0087 0x0073 56 *Catatan 4, 5
Papan Ketik/Papan Tombol Keyboard International2 0x0007 0x0088 0x0070 133 *Catatan 5
Papan Ketik/Tombol Keyboard International3 0x0007 0x0089 0x007D 14 *Catatan 5
Keyboard/Keypad Keyboard International4 0x0007 0x008A 0x0079 132 *Catatan 5
Papan Ketik/Papan Tombol Keyboard International5 0x0007 0x008B 0x007B 131 *Catatan 5
Papan Ketik/Pad Ketik Keyboard International6 0x0007 0x008C 0x005C
Papan Ketik/Papan Tombol Papan Ketik LANG1 0x0007 0x0090 0x0072 *Catatan 6
0x00F2 *Catatan 3, 6
Papan Ketik/Tutup Tombol Keyboard LANG2 0x0007 0x0091 0x0071 *Catatan 6
0x00F1 *Catatan 3, 6
Papan Ketik/Papan Tombol Papan Ketik LANG3 0x0007 0x0092 0x0078
Papan Ketik/Papan Tombol Papan Ketik LANG4 0x0007 0x0093 0x0077
Papan Ketik/Papan Tombol Keyboard LANG5 0x0007 0x0094 0x0076
Papan Ketik/Tombol Papan Ketik Control Kiri 0x0007 0x00E0 0x001D 58
Papan Ketik/Keypad Papan Ketik Shift Kiri 0x0007 0x00E1 0x002A 44
Papan Ketik/Keypad Alt Kiri 0x0007 0x00E2 0x0038 60
Papan Ketik/Tombol Papan Tombol GUI Kiri pada Keyboard 0x0007 0x00E3 0xE05B 127
Papan Ketik/Papan Tombol Keyboard RightControl 0x0007 0x00E4 0xE01D 64
Papan Ketik/Papan Tombol Keyboard RightShift 0x0007 0x00E5 0x0036 57
Papan Ketik/Papan Tombol Alt Kanan pada Keyboard 0x0007 0x00E6 0xE038 62
Papan Ketik/Papan Tombol Keyboard GUI Kanan 0x0007 0x00E7 0xE05C 128
Konsumen Pindai Lagu Berikutnya 0x000C 0x00B5 0xE019
Konsumen Pemindai Lagu Sebelumnya 0x000C 0x00B6 0xE010
Konsumen Berhenti 0x000C 0x00B7 0xE024
Konsumen Mainkan/Jeda 0x000C 0x00CD 0xE022
Konsumen Bisu 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 Mesin Lokal AL 0x000C 0x0194 0xE06B
Konsumen Pencarian AC 0x000C 0x0221 0xE065
Konsumen Beranda Utama AC 0x000C 0x0223 0xE032
Konsumen AC Kembali 0x000C 0x0224 0xE06A
Konsumen AC Forward 0x000C 0x0225 0xE069
Konsumen Pemutus AC 0x000C 0x0226 0xE068
Konsumen Perawatan AC 0x000C 0x0227 0xE067
Konsumen Marka Buku AC 0x000C 0x022A 0xE066

Catatan:

  1. SysRq kode pemindaian tombol dikeluarkan saat penekanan tombol Alt+Print screen
  2. Kode pemindaian tombol dipancarkan ketika Control+Pause penekanan tombol
  3. Seperti yang terlihat dalam pesan keyboard versi lama
  4. Kuncinya ada di keyboard Brasil
  5. Kuncinya ada di keyboard Jepang
  6. Kode pemindaian hanya dipancarkan dalam peristiwa rilis kunci

Bendera Extended-Key

Bendera kunci yang diperluas menunjukkan apakah pesan penekanan tombol berasal dari salah satu tombol tambahan pada keyboard tombol 101/102 yang ditingkatkan. Tombol tambahan terdiri dari tombol ALT dan CTRL di sisi kanan keyboard; tombol INS, DEL, HOME, END, PAGE UP, PAGE DOWN, dan panah pada kelompok di sebelah kiri tombol angka; tombol NUM LOCK; tombol BREAK (CTRL+PAUSE), tombol PRINT SCRN; dan tombol bagi (/) serta tombol 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 ditekan dan 0 jika tidak ditekan.

Sebelumnya Bendera Key-State

Indikator status kunci sebelumnya menunjukkan apakah kunci yang menghasilkan pesan penekanan tombol sebelumnya aktif atau nonaktif. Ini adalah 1 jika tombol sebelumnya ditekan dan 0 jika tombol sebelumnya dilepas. 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 Transition-State

Penanda status transisi menunjukkan apakah menekan atau melepas tombol 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 memberikan kode karakter untuk penekanan tombol karakter. Untuk mengambil kode karakter, aplikasi harus menyertakan fungsi TranslateMessage dalam loop pesan thread-nya. 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. Iterasi loop pesan selanjutnya menghapus pesan karakter dari antrean dan mengirimkan pesan ke prosedur jendela yang sesuai.

Bagian ini membahas topik berikut:

Pesan Karakter Non-Sistem

Prosedur jendela dapat menerima pesan karakter berikut: WM_CHAR, WM_DEADCHAR, WM_SYSCHAR, WM_SYSDEADCHAR, dan WM_UNICHAR. FungsiTranslateMessage 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 fungsiDefWindowProc. 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 ini menggunakan pesan WM_SYSCHAR dan WM_SYSDEADCHAR untuk mengimplementasikan mnemonik menu.

Parameter wParam dari semua pesan karakter berisi kode karakter dari tombol karakter yang ditekan. Nilai kode karakter tergantung pada kelas jendela jendela yang menerima pesan. Jika versi Unicode dari fungsiRegisterClass 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 dari parameter lParam dari pesan karakter adalah identik dengan konten dari parameter lParam dari pesan key-down yang diterjemahkan untuk menghasilkan pesan karakter. Untuk informasi, lihat Bendera Pesan Ketikan .

Pesan Dead-Character

Beberapa papan ketik non-Bahasa Inggris memiliki tombol karakter yang tidak dirancang untuk menghasilkan karakter secara langsung. Sebaliknya, mereka digunakan untuk menambahkan diakritik pada 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 yang pertama berisi kode karakter diakritik; parameter wParam dari yang kedua berisi kode karakter kunci karakter berikutnya.

FungsiTranslateMessage 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 fungsiGetKeyStateuntuk menentukan status kunci virtual pada saat pesan saat ini dibuat; ini dapat menggunakan fungsiGetAsyncKeyState untuk mengambil status kunci virtual saat ini.

Tata letak keyboard menyimpan 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 fungsiGetKeyNameText.

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 pintas. Ini berarti bahwa ketika Microsoft Rich Edit 3.0 dimasukkan ke dalam aplikasi, aplikasi akan mewarisi fitur IME HexToUnicode.

Dukungan Hot-Key

hot key adalah kombinasi kunci yang menghasilkan pesan WM_HOTKEY, pesan yang ditempatkan oleh sistem di bagian atas antrean pesan utas, melewati pesan yang sudah 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 mendefinisikan tombol pintas, aplikasi menggunakan fungsiRegisterHotKey, menentukan kombinasi tombol yang menghasilkan pesan WM_HOTKEY, handle ke jendela untuk menerima pesan, dan pengidentifikasi tombol pintas. Saat pengguna menekan kunci pintas, pesan WM_HOTKEY ditempatkan ke dalam antrean pesan dari utas yang membuat jendela. Pesan parameter wParam berisi pengidentifikasi hotkey. Aplikasi bisa menetapkan beberapa tombol pintas untuk utas, tetapi setiap tombol pintas di utas harus memiliki pengidentifikasi unik. Sebelum aplikasi dihentikan, aplikasi harus menggunakan fungsi UnregisterHotKey untuk menghancurkan tombol pintas.

Aplikasi dapat menggunakan pengaturan tombol pintas untuk memudahkan pengguna memilih hotkey. Kontrol hot key biasanya digunakan untuk menentukan hot key yang mengaktifkan jendela; mereka tidak menggunakanRegisterHotKey dan fungsiUnregisterHotKey. Sebagai gantinya, aplikasi yang menggunakan kontrol kunci panas biasanya mengirim pesan WM_SETHOTKEY untuk mengatur kunci panas. Setiap kali pengguna menekan tombol panas, sistem mengirim pesan WM_SYSCOMMAND yang menentukan SC_HOTKEY. Untuk informasi selengkapnya tentang kontrol tombol pintas, lihat "Menggunakan Kontrol Tombol Pintas" di Kontrol Tombol Pintas.

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, fungsiShellProc 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 XBUTTONs.

Mensimulasikan Input

Untuk menyimulasikan serangkaian peristiwa input pengguna yang tidak terganggu, gunakan fungsiSendInput. Fungsi menerima tiga parameter. Parameter pertama, cInputs, menunjukkan jumlah peristiwa input yang akan disimulasikan. Parameter kedua, rgInputs, adalah array dari 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 event input yang berhasil dijalankan. Jika nilai ini nol, maka input diblokir.

FungsiSendInput 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 fungsiGetAsyncKeyStatedan koreksi seperlunya.

Bahasa, Lokal, dan Tata Letak Keyboard

Bahasa adalah bahasa alami, seperti Inggris, Prancis, dan Jepang. Sublanguage adalah varian bahasa alami yang digunakan di wilayah geografis tertentu, seperti subbahasa dari bahasa Inggris yang digunakan di Inggris dan Amerika Serikat. Aplikasi menggunakan nilai, yang disebut pengidentifikasi bahasa , untuk mengidentifikasi bahasa dan sublanguage 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. Mengatur lokal untuk tampilan atau printer mempengaruhi glif 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" dari nama adalah pengidentifikasi bahasa. Kata tinggi adalah pegangan perangkat yang menentukan tata letak fisik, atau bernilai nol, yang 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 handle ke tata letak keyboard atau pengidentifikasi bahasa yang diperpanjang 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 thread yang memanggil. 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. FungsiGetKeyboardLayout dapat digunakan untuk menentukan bahasa input.

Fungsi LoadKeyboardLayout memuat tata letak keyboard dan membuat tata letak tersedia untuk pengguna. Aplikasi dapat segera mengaktifkan tata letak 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. Tanda KLF_NOTELLSHELL mencegah fungsi program memberi tahu shell ketika 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.

FungsiUnloadKeyboardLayout 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.