Seperti yang Anda ketahui: C# adalah bahasa pendamping untuk platform .NET Framework, dan tidak mungkin untuk mengimplementasikan kait global dengan pustaka dan ketentuan kompiler sendiri. Tetapi dalam praktiknya panggilan ke kode yang tidak dikelola tetap benar di C#, menggunakan properti DllImport untuk mereferensikan metode dalam pustaka kode yang tidak dikelola. Fungsi kait ada di user32.dll, dan prototipe fungsinya adalah sebagai berikut:
HHOOK WINAPI SetWindowsHookEx(
__in int idHook,
__in HOOKPROC lpfn,
__in HINSTANCE hMod,
__in DWORD dwThreadId);
Ini dapat digunakan untuk mendaftarkan jenis metode pemrosesan intersepsi pesan tertentu dengan sistem operasi (Windows), misalnya, kita dapat mendaftarkan kait untuk memblokir pesan keyboard global, sehingga semua peristiwa penekanan dan angkat keyboard dapat dirasakan dan diproses oleh kita (tidak menutup kemungkinan bahwa ada kait front-end untuk menjatuhkan pesan).
Kita dapat mereferensikan fungsi ini dalam C# dengan menyatakannya seperti ini:
[dllImport("user32.dll")] publik statis eksternal int SetWindowsHookEx( HookType idHook, HookProc lpfn, IntPtr hInstance, int threadId );
Perlu disebutkan bahwa HookType dan HookProc di atas adalah tipe khusus saya, yang tidak penting (karena program meneruskan alamat memori saat berjalan), tetapi harus memenuhi spesifikasi tertentu.
Parameter fungsi dari atas ke bawah adalah:
idHook, yang diwakili di sini oleh enum berbentuk Fungsi panggilan balik LPFN saat kait mulai bermain hInstance modul instance instance (biasanya pegangan modul instance aplikasi tempat fungsi callback hook Anda berada) threadIdPengidentifikasi utas yang terkait dengan subrutin hook yang diinstal
Ada beberapa jenis kail:
Kami umumnya menggunakan 13 untuk memblokir pesan keyboard dan 14 untuk memblokir pesan mouse.
Deklarasi fungsi callback Kita perlu menggunakan delegasi di C#, dan deklarasinya adalah sebagai berikut: delegasi publik int HookProc(int nCode, int wParam, IntPtr lParam);
Parameter top-down berarti bahwa parameter yang diteruskan kembali oleh rantai hook nCode, 0 berarti pesan ini (oleh hook pesan sebelumnya) dibuang, dan non-0 berarti pesan ini terus valid
Parameter pesan wParam
Parameter pesan lParam
Perlu disebutkan bahwa wParam dan lParam adalah jenis yang berbeda dari jenis pesan yang berbeda, tetapi jenis wParam dapat secara kasar diwakili oleh pencacahan berikut:
lParam umumnya dienkapsulasi sebagai struktur, yang bervariasi tergantung pada jenis pesan, dua struktur berikut adalah struktur lParam dari pesan mouse dan keyboard:
Ketika kita memahami informasi di atas, kita memiliki pemahaman dasar tentang implementasi C# dari fungsi hook, dan kemudian memperhatikan beberapa pertanyaan:
1. Kait memakan banyak sumber daya, dan harus dibatalkan tepat waktu saat tidak digunakan, yang memerlukan penggunaan fungsi UnhookWindowsHookEx
2. Sebagai kesopanan, kait harus mengembalikan hasil pemrosesan kait berikutnya, bukan hasil pemrosesan kait saat ini saja (gunakan CallNextHookEx untuk memanggil kait berikutnya, karena kait diatur terlebih dahulu dan kemudian diterapkan, jadi harus dilakukan untuk memastikan pengiriman normal rantai kait).
3. HInstance dalam parameter fungsi hook hanya di mana fungsi callback dari hook saat ini berada, dan alamat yang benar harus diberikan
4. Karena delegasi digunakan, harus dipastikan bahwa alamat memori delegasi (referensi ke metode) tidak akan dibuang, jika tidak, akan ada pengecualian saat hook dieksekusi
Anda dapat mengunduh contoh program yang saya tulis, tetapi program saya membutuhkan poin-poin utama berikut:
1. Saya memblokir implementasi hook, dan hanya membuka intersepsi pesan dan pemrosesan keyboard dan mouse (metode penggunaannya sama dengan peristiwa mouse dan keyboard WinForm C#), dan Anda dapat membuka yang lain
2. Saya merancang kait untuk berada dalam mode singleton, Anda dapat membatalkannya
3. Karena intrusi tertentu ke dalam sistem operasi, perangkat lunak antivirus dapat dilaporkan sebagai berisiko
4. Kodenya ditulis dengan buruk, puas saja......
Terakhir, perbedaan antara teknologi pemrograman dan bahasa adalah bahwa kompiler dan penggunanya berbeda, orang yang menggunakan C tidak dapat dikatakan lebih tinggi daripada mereka yang menggunakan Java, dan teknologi belum tentu tercermin dalam pointer, matriks, struktur data, selama orang yang memahami prinsip komputer, prinsip kompilasi, prinsip sistem operasi, dll. Tentu saja, ada baiknya setiap orang memiliki bahasa favorit mereka sendiri dan metode pemrograman biasa.
|