Bagikan melalui


Gambaran Umum Hook

Kait adalah mekanisme di mana aplikasi dapat mencegat peristiwa, seperti pesan, tindakan 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.

Beberapa contoh berikut menggunakan untuk kait:

  • Memantau pesan untuk tujuan penelusuran kesalahan
  • Memberikan dukungan untuk perekaman dan pemutaran makro
  • Memberikan dukungan untuk kunci bantuan (F1)
  • Mensimulasikan input mouse dan keyboard
  • Menerapkan aplikasi pelatihan berbasis komputer (CBT)

Catatan

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-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 hook WH_MOUSE untuk memantau lalu lintas pesan untuk pesan mouse.

Sistem ini mempertahankan rantai kait terpisah untuk setiap jenis kait. Rantai kait adalah daftar pointer ke fungsi panggilan balik khusus yang ditentukan aplikasi yang disebut prosedur kait. Ketika pesan terjadi yang terkait dengan jenis kait tertentu, sistem meneruskan pesan ke setiap prosedur kait yang dirujuk 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; orang lain dapat memodifikasi pesan atau menghentikan kemajuan mereka melalui rantai, mencegah mereka mencapai prosedur kait berikutnya atau jendela tujuan.

Prosedur Kait

Untuk memanfaatkan jenis kait tertentu, pengembang menyediakan prosedur kait dan menggunakan fungsi SetWindowsHookEx untuk menginstalnya ke dalam rantai yang terkait dengan kait. Prosedur kait harus memiliki sintaks berikut:

LRESULT CALLBACK HookProc(
  int nCode, 
  WPARAM wParam, 
  LPARAM lParam
)
{
   // process event
   ...

   return CallNextHookEx(NULL, nCode, wParam, lParam);
}

HookProc adalah tempat penampung 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 menginstal prosedur kait di awal rantai kait. Ketika peristiwa terjadi yang dipantau oleh jenis kait tertentu, sistem memanggil prosedur di 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 hook, terlepas dari apakah prosedur tertentu memanggil CallNextHookEx.

Hook global memantau pesan untuk semua utas di desktop yang sama dengan utas panggilan. Hook khusus utas memantau pesan hanya untuk utas individual. Prosedur kait global dapat dipanggil dalam konteks aplikasi apa pun di desktop yang sama dengan utas panggilan, sehingga prosedur harus berada dalam modul DLL terpisah. Prosedur kait khusus utas hanya dipanggil dalam konteks utas terkait. Jika aplikasi menginstal prosedur kait untuk salah satu utasnya sendiri, prosedur kait dapat berada dalam modul yang sama dengan kode aplikasi lainnya atau di DLL. Jika aplikasi menginstal prosedur kait untuk utas aplikasi yang berbeda, prosedur harus dalam DLL. Untuk informasi, lihat Pustaka Tautan Dinamis.

Catatan

Anda harus menggunakan kait global hanya untuk tujuan penelusuran kesalahan; jika tidak, Anda harus menghindarinya. Kait global merusak performa sistem dan menyebabkan konflik dengan aplikasi lain yang menerapkan jenis kait global yang sama.

 

Jenis Kait

Setiap jenis kait memungkinkan aplikasi untuk memantau aspek yang berbeda dari mekanisme penanganan pesan sistem. Bagian berikut menjelaskan kait yang tersedia.

WH_CALLWNDPROC dan WH_CALLWNDPROCRET

Kait WH_CALLWNDPROC dan WH_CALLWNDPROCRET memungkinkan Anda memantau pesan yang dikirim ke prosedur jendela. Sistem memanggil prosedur hook WH_CALLWNDPROC sebelum meneruskan pesan ke prosedur jendela penerima, dan memanggil prosedur hook WH_CALLWNDPROCRET setelah prosedur jendela memproses pesan.

Kait WH_CALLWNDPROCRET meneruskan pointer ke struktur CWPRETSTRUCT ke prosedur kait. Struktur berisi nilai pengembalian dari prosedur jendela yang memproses pesan, serta parameter pesan yang terkait dengan pesan. Subkelas jendela tidak berfungsi untuk pesan yang diatur di antara 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 mengubah 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. Hook 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 kait WH_DEBUG sebelum memanggil prosedur kait yang terkait dengan kait 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 selama waktu ketika utas latar depannya menganggur. Sistem memanggil prosedur kait WH_FOREGROUNDIDLE ketika utas latar depan aplikasi akan menganggur.

Untuk informasi selengkapnya, lihat fungsi panggilan balik ForegroundIdleProc .

WH_GETMESSAGE

Hook WH_GETMESSAGE memungkinkan aplikasi untuk memantau pesan yang akan dikembalikan oleh fungsi GetMessage atau PeekMessage . Anda dapat menggunakan hook 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_JOURNALPLAYBACK

Peringatan

JOURNALING Hooks API tidak didukung mulai dari Windows 11 dan akan dihapus dalam rilis mendatang. Karena itu, sebaiknya panggil API TextInput SendInput 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 hook WH_JOURNALPLAYBACK diinstal. Hook WH_JOURNALPLAYBACK adalah hook global—tidak dapat digunakan sebagai hook khusus utas.

Hook WH_JOURNALPLAYBACK mengembalikan nilai waktu habis. Nilai ini memberi tahu sistem berapa milidetik untuk menunggu sebelum memproses pesan saat ini dari hook pemutaran. Ini memungkinkan kait untuk mengontrol waktu peristiwa yang diputarnya kembali.

Untuk informasi selengkapnya, lihat fungsi panggilan balik JournalPlaybackProc .

WH_JOURNALRECORD

Peringatan

JOURNALING Hooks API tidak didukung mulai dari Windows 11 dan akan dihapus dalam rilis mendatang. Karena itu, sebaiknya panggil API TextInput SendInput sebagai gantinya.

Hook WH_JOURNALRECORD memungkinkan Anda memantau dan merekam peristiwa input. Biasanya, Anda menggunakan hook ini untuk merekam urutan peristiwa mouse dan keyboard untuk diputar kembali nanti dengan menggunakan WH_JOURNALPLAYBACK. Hook WH_JOURNALRECORD adalah kait global—tidak dapat digunakan sebagai kait khusus utas.

Untuk informasi selengkapnya, lihat fungsi panggilan balik JournalRecordProc .

WH_KEYBOARD_LL

Hook WH_KEYBOARD_LL memungkinkan Anda memantau peristiwa input keyboard yang akan diposting dalam antrean input utas.

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 akan dikembalikan oleh fungsi GetMessage atau PeekMessage . Anda dapat menggunakan hook WH_KEYBOARD untuk memantau input keyboard yang diposting ke 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 utas.

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 hook WH_MOUSE untuk memantau input mouse yang diposting ke antrean pesan.

Untuk informasi selengkapnya, 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 menginstal prosedur hook. Hook WH_SYSMSGFILTER memantau pesan tersebut untuk semua aplikasi.

Hook 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 waktu ia mengambil pesan dari antrean dan waktu pengiriman pesan, melakukan pemrosesan khusus sebagaimana mewajibkan. Namun, selama perulangan modal, sistem mengambil dan mengirimkan pesan tanpa mengizinkan aplikasi kesempatan untuk memfilter pesan dalam perulangan pesan utamanya. Jika aplikasi menginstal prosedur kait WH_MSGFILTER atau WH_SYSMSGFILTER , sistem memanggil prosedur selama perulangan modal.

Aplikasi dapat memanggil hook WH_MSGFILTER secara langsung dengan memanggil fungsi CallMsgFilter . 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, enkapsulasi operasi pemfilteran dalam prosedur kait WH_MSGFILTER dan panggil CallMsgFilter 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 hook WH_SHELL untuk menerima pemberitahuan penting. Sistem memanggil prosedur kait WH_SHELL ketika aplikasi shell akan diaktifkan dan ketika jendela tingkat atas dibuat atau dihancurkan.

Perhatikan bahwa aplikasi shell kustom tidak menerima pesan WH_SHELL . Oleh karena itu, aplikasi apa pun yang mendaftarkan dirinya sebagai shell default harus memanggil fungsi SystemParametersInfo sebelum (atau aplikasi lain) dapat menerima pesan WH_SHELL . Fungsi ini harus dipanggil dengan SPI_SETMINIMIZEDMETRICS dan struktur MINIMIZEDMETRICS . Atur anggota iArrange dari struktur ini ke ARW_HIDE.

Untuk informasi selengkapnya, lihat fungsi panggilan balik ShellProc .