Gambaran Umum Pengait
kait adalah mekanisme yang memungkinkan aplikasi untuk memantau peristiwa, seperti pesan, gerakan mouse, dan penekanan tombol. Fungsi yang mencegat jenis peristiwa tertentu dikenal sebagai prosedur kait . Prosedur kait dapat bertindak pada setiap peristiwa yang diterimanya, lalu memodifikasi atau membuang peristiwa.
Berikut beberapa contoh penggunaan untuk kait:
- Memantau pesan untuk tujuan pemecahan masalah
- Memberikan dukungan untuk perekaman dan pemutaran makro
- Menyediakan fungsi untuk tombol Bantuan (F1)
- Mensimulasikan input mouse dan keyboard
- Menerapkan aplikasi pelatihan berbasis komputer (CBT)
Nota
Kait cenderung memperlambat sistem karena meningkatkan jumlah pemrosesan yang harus dilakukan sistem untuk setiap pesan. Anda harus menginstal kait hanya jika perlu, dan menghapusnya sesegera mungkin.
Bagian ini membahas hal berikut:
Rantai Kait
Sistem ini mendukung berbagai jenis kait; setiap jenis menyediakan akses ke aspek yang berbeda dari mekanisme penanganan pesannya. Misalnya, aplikasi dapat menggunakan kait WH_MOUSE untuk memantau lalu lintas pesan untuk pesan mouse.
Sistem mempertahankan rantai kait terpisah untuk setiap jenis kait. Rantai kait adalah daftar penunjuk ke fungsi panggilan balik khusus yang didefinisikan oleh aplikasi, yang disebut prosedur kait . Ketika pesan muncul yang terkait dengan tipe kait tertentu, sistem meneruskan pesan kepada setiap prosedur kait yang disebutkan dalam rantai kait, satu demi satu. Tindakan yang dapat dilakukan prosedur kait tergantung pada jenis kait yang terlibat. Prosedur kait untuk beberapa jenis kait hanya dapat memantau pesan; yang lain dapat memodifikasi pesan atau menghentikan kemajuan mereka melalui rantai, mencegah mereka mencapai prosedur kait berikutnya atau jendela tujuan.
Prosedur Hook
Untuk memanfaatkan jenis kait tertentu, pengembang menyediakan prosedur kait dan menggunakan fungsi SetWindowsHookEx untuk menginstalnya ke dalam rantai yang terkait dengan kait tersebut. Prosedur hook harus memiliki sintaks berikut:
LRESULT CALLBACK HookProc(
int nCode,
WPARAM wParam,
LPARAM lParam
)
{
// process event
...
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
HookProc adalah placeholder untuk nama yang ditentukan aplikasi.
Parameter nCode adalah kode kait yang digunakan prosedur kait untuk menentukan tindakan yang akan dilakukan. Nilai kode kait tergantung pada jenis kait; setiap jenis memiliki sekumpulan kode kaitnya sendiri. Nilai parameter wParam dan lParam bergantung pada kode kait, tetapi biasanya berisi informasi tentang pesan yang dikirim atau diposting.
Fungsi SetWindowsHookEx selalu memasang prosedur pengait di awal rantai pengait. Ketika peristiwa terjadi yang dimonitor oleh jenis kait tertentu, sistem memanggil prosedur pada awal rantai kait yang terkait dengan kait. Setiap prosedur kait dalam rantai menentukan apakah akan meneruskan peristiwa ke prosedur berikutnya. Prosedur kait meneruskan peristiwa ke prosedur berikutnya dengan memanggil fungsi CallNextHookEx.
Perhatikan bahwa prosedur kait untuk beberapa jenis kait hanya dapat memantau pesan. sistem meneruskan pesan ke setiap prosedur kait, terlepas dari apakah prosedur tertentu memanggil CallNextHookEx.
Hook global memantau pesan untuk semua utas di desktop yang sama dengan utas panggilan. Hook khusus alur memantau pesan hanya untuk utas individual. Prosedur kait global dapat dipanggil dalam konteks aplikasi apa pun di desktop yang sama dengan thread yang melakukan panggilan, sehingga prosedur tersebut harus berada dalam modul DLL yang terpisah. Prosedur kait khusus utas hanya dipanggil dalam konteks utas yang terkait. Jika sebuah aplikasi menginstal prosedur hook untuk salah satu utasnya sendiri, prosedur tersebut dapat berada dalam modul yang sama dengan sisa kode aplikasi atau dalam sebuah DLL. Jika aplikasi menginstal prosedur hook untuk utas aplikasi yang berbeda, prosedur tersebut harus berada di dalam DLL. Untuk informasi, lihat Dynamic-Link pustaka.
Nota
Anda sebaiknya menggunakan kait global hanya untuk debugging; selain itu, Anda sebaiknya menghindarinya. Kait global merusak performa sistem dan menyebabkan konflik dengan aplikasi lain yang mengimplementasikan jenis kait global yang sama.
Jenis Kait
Setiap jenis kait memungkinkan aplikasi untuk memantau aspek yang berbeda dari mekanisme penanganan pesan sistem. Bagian selanjutnya menjelaskan hook yang tersedia.
- WH_CALLWNDPROC dan WH_CALLWNDPROCRET
- WH_CBT
- WH_DEBUG
- WH_FOREGROUNDIDLE
- WH_GETMESSAGE
- WH_JOURNALPLAYBACK
- WH_JOURNALRECORD
- WH_KEYBOARD_LL
- WH_KEYBOARD
- WH_MOUSE_LL
- WH_MOUSE
- WH_MSGFILTER dan WH_SYSMSGFILTER
- WH_SHELL
WH_CALLWNDPROC dan WH_CALLWNDPROCRET
Pengait WH_CALLWNDPROC dan WH_CALLWNDPROCRET memungkinkan Anda memantau pesan yang dikirim ke prosedur jendela Windows. Sistem memanggil prosedur kait WH_CALLWNDPROC sebelum meneruskan pesan ke prosedur jendela penerimaan, dan memanggil prosedur kait WH_CALLWNDPROCRET setelah prosedur jendela memproses pesan.
Kait WH_CALLWNDPROCRET meneruskan pointer ke strukturCWPRETSTRUCTke prosedur kait. Struktur berisi nilai pengembalian dari prosedur jendela yang memproses pesan, serta parameter pesan yang terkait dengan pesan. Subklasifikasi jendela tidak berfungsi untuk pesan yang dikirim antar proses.
Untuk informasi selengkapnya, lihat fungsi panggilan balik CallWndProc dan CallWndRetProc.
WH_CBT
Sistem memanggil prosedur kait WH_CBT sebelum mengaktifkan, membuat, menghancurkan, meminimalkan, memaksimalkan, memindahkan, atau mengatur ukuran jendela; sebelum menyelesaikan perintah sistem; sebelum menghapus peristiwa mouse atau keyboard dari antrean pesan sistem; sebelum mengatur fokus input; atau sebelum menyinkronkan dengan antrean pesan sistem. Nilai yang dikembalikan prosedur kait menentukan apakah sistem mengizinkan atau mencegah salah satu operasi ini. Kait WH_CBT ditujukan terutama untuk aplikasi pelatihan berbasis komputer (CBT).
Untuk informasi selengkapnya, lihat fungsi panggilan balik CBTProc.
Untuk informasi, lihat WinEvents.
WH_DEBUG
Sistem memanggil prosedur pengait WH_DEBUG sebelum memanggil prosedur pengait yang berhubungan dengan pengait lain dalam sistem. Anda dapat menggunakan kait ini untuk menentukan apakah akan mengizinkan sistem memanggil prosedur kait yang terkait dengan jenis kait lainnya.
Untuk informasi selengkapnya, lihat fungsi panggilan balik DebugProc.
WH_FOREGROUNDIDLE
Hook WH_FOREGROUNDIDLE memungkinkan Anda melakukan tugas prioritas rendah saat utas latar depannya sedang tidak aktif. Sistem memanggil prosedur kait WH_FOREGROUNDIDLE ketika thread latar depan aplikasi menjadi tidak aktif.
Untuk informasi selengkapnya, lihat fungsi panggilan balik ForegroundIdleProc.
WH_GETMESSAGE
Hook WH_GETMESSAGE memungkinkan aplikasi memantau pesan yang akan dikembalikan oleh fungsiGetMessage atau PeekMessage. Anda dapat menggunakan kait WH_GETMESSAGE untuk memantau input mouse dan keyboard dan pesan lain yang diposting ke antrean pesan.
Untuk informasi selengkapnya, lihat fungsi panggilan balik GetMsgProc.
WH_JURNALPUTARULANG
Peringatan
Journaling Hooks API tidak didukung sejak Windows 11 dan akan dihapus pada rilis mendatang. Karena itu, kami sangat merekomendasikan memanggil SendInput TextInput API sebagai gantinya.
Hook WH_JOURNALPLAYBACK memungkinkan aplikasi menyisipkan pesan ke dalam antrean pesan sistem. Anda dapat menggunakan hook ini untuk memutar kembali serangkaian peristiwa mouse dan keyboard yang direkam sebelumnya dengan menggunakan WH_JOURNALRECORD. Input mouse dan keyboard reguler dinonaktifkan selama kait WH_JOURNALPLAYBACK dipasang. Hook WH_JOURNALPLAYBACK adalah kait global—kait tersebut tidak dapat digunakan sebagai kait khusus utas.
Hook WH_JOURNALPLAYBACK mengembalikan nilai batas waktu. Nilai ini memberi tahu sistem berapa milidetik untuk menunggu sebelum memproses pesan terkini dari hook pemutaran. Ini memungkinkan hook untuk mengontrol waktu peristiwa yang diputarnya kembali.
Untuk informasi selengkapnya, lihat fungsi panggilan balik JournalPlaybackProc.
WH_JOURNALRECORD
Peringatan
API journaling hooks tidak didukung mulai Windows 11 dan akan dihapus dalam rilis mendatang. Karena itu, kami sangat menyarankan untuk memanggil API SendInput TextInput sebagai gantinya.
Pengait WH_JOURNALRECORD memungkinkan Anda memantau dan merekam kejadian input. Biasanya, Anda menggunakan kait ini untuk merekam urutan kejadian mouse dan keyboard untuk diputar kembali nanti dengan menggunakan WH_JOURNALPLAYBACK. Kait WH_JOURNALRECORD adalah kait global—kait tersebut tidak dapat digunakan sebagai kait khusus utas.
Untuk informasi selengkapnya, lihat fungsi panggilan balikJournalRecordProc.
WH_KEYBOARD_LL
Hook WH_KEYBOARD_LL memungkinkan Anda memantau kejadian input keyboard yang akan diteruskan ke antrean input thread.
Untuk informasi selengkapnya, lihat fungsi panggilan balik LowLevelKeyboardProc.
WH_KEYBOARD
Hook WH_KEYBOARD memungkinkan aplikasi memantau lalu lintas pesan untuk pesan WM_KEYDOWN dan WM_KEYUP yang akan dikembalikan olehGetMessage atau fungsiPeekMessage. Anda dapat menggunakan kait WH_KEYBOARD untuk memantau input keyboard yang telah diposting ke dalam antrean pesan.
Untuk informasi selengkapnya, lihat fungsi panggilan balik KeyboardProc.
WH_MOUSE_LL
Hook WH_MOUSE_LL memungkinkan Anda memantau peristiwa input mouse yang akan diposting dalam antrean input thread.
Untuk informasi selengkapnya, lihat fungsi panggilan balik LowLevelMouseProc.
WH_MOUSE
Hook WH_MOUSE memungkinkan Anda memantau pesan mouse yang akan dikembalikan oleh fungsi GetMessage atau PeekMessage. Anda dapat menggunakan kait WH_MOUSE untuk memantau input mouse yang dikirimkan ke antrian pesan.
Untuk informasi lebih lanjut, lihat fungsi panggilan balik MouseProc.
WH_MSGFILTER dan WH_SYSMSGFILTER
Hook WH_MSGFILTER dan WH_SYSMSGFILTER memungkinkan Anda memantau pesan yang akan diproses oleh menu, bilah gulir, kotak pesan, atau kotak dialog, dan untuk mendeteksi kapan jendela yang berbeda akan diaktifkan sebagai akibat dari pengguna menekan kombinasi tombol ALT+TAB atau ALT+ESC. Hook WH_MSGFILTER hanya dapat memantau pesan yang diteruskan ke menu, bilah gulir, kotak pesan, atau kotak dialog yang dibuat oleh aplikasi yang memasang prosedur hook. Hook WH_SYSMSGFILTER memantau pesan tersebut untuk semua aplikasi.
Kait WH_MSGFILTER dan WH_SYSMSGFILTER memungkinkan Anda melakukan pemfilteran pesan selama perulangan modal yang setara dengan pemfilteran yang dilakukan dalam perulangan pesan utama. Misalnya, aplikasi sering memeriksa pesan baru dalam perulangan utama antara saat pesan diambil dari antrean dan saat pesan dikirimkan, melakukan pemrosesan khusus sebagaimana diperlukan. Namun, selama perulangan modal, sistem mengambil dan mengirimkan pesan tanpa mengizinkan aplikasi kesempatan untuk memfilter pesan dalam perulangan pesan utamanya. Jika aplikasi memasang prosedur kait WH_MSGFILTER atau WH_SYSMSGFILTER, sistem memanggil prosedur selama siklus modal.
Aplikasi dapat memanggil hook WH_MSGFILTER secara langsung dengan memanggil fungsiCallMsgFilter. Dengan menggunakan fungsi ini, aplikasi dapat menggunakan kode yang sama untuk memfilter pesan selama perulangan modal seperti yang digunakan dalam perulangan pesan utama. Untuk melakukannya, bungkus operasi pemfilteran dalam prosedur kait WH_MSGFILTER dan panggil CallMsgFilter di antara panggilan ke fungsi GetMessage dan DispatchMessage.
while (GetMessage(&msg, (HWND) NULL, 0, 0))
{
if (!CallMsgFilter(&qmsg, 0))
DispatchMessage(&qmsg);
}
Argumen terakhir dari CallMsgFilter hanya diteruskan ke prosedur kait; Anda dapat memasukkan nilai apa pun. Prosedur kait, dengan menentukan konstanta seperti MSGF_MAINLOOP, dapat menggunakan nilai ini untuk menentukan dari mana prosedur dipanggil.
Untuk informasi selengkapnya, lihat fungsi panggilan balik MessageProc dan SysMsgProc.
WH_SHELL
Aplikasi shell dapat menggunakan kait WH_SHELL untuk menerima pemberitahuan penting. Sistem memanggil prosedur kait WH_SHELL ketika aplikasi shell akan diaktifkan dan ketika jendela tingkat atas dibuat atau dihapus.
Perhatikan bahwa aplikasi shell kustom tidak menerima pesan WH_SHELL. Oleh karena itu, aplikasi apa pun yang mendaftarkan dirinya sebagai shell default harus memanggil fungsiSystemParametersInfo sebelum (atau aplikasi lain) dapat menerima pesan WH_SHELL. Fungsi ini harus dipanggil dengan SPI_SETMINIMIZEDMETRICS dan sebuah struktur MINIMIZEDMETRICS . Tetapkan iArrange sebagai anggota struktur ini ke ARW_HIDE.
Untuk informasi selengkapnya, lihat fungsi panggilan balik ShellProc.