Menggunakan Cangkuk Papan Kekunci Global (WH_KEYBOARD_LL) dalam WPF / C#
Untuk menangani isu pendengar papan kekunci berhenti berfungsi selepas tempoh masa, adalah penting untuk memahami punca masalah. Punca isu ini terletak pada cara perwakilan panggil balik dibuat dan digunakan dalam kaedah SetHook.
Coretan kod berikut menunjukkan isu:
public static IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } }
Dalam kod ini, panggilan balik perwakilan dibuat sebaris dalam panggilan kaedah SetHook dan diberikan kepada parameter proc. Walau bagaimanapun, perwakilan ini tidak diberikan kepada mana-mana pembolehubah atau harta lain dalam kelas atau contoh, bermakna tiada rujukan kepadanya yang menghalangnya daripada menjadi sampah dikumpul.
Apabila perwakilan dikumpul sampah, penunjuk fungsi yang dihantar kepada SetWindowsHookEx menjadi tidak sah dan panggilan balik tidak boleh digunakan lagi. Inilah sebabnya mengapa pendengar berhenti bekerja selepas beberapa ketika.
Untuk menyelesaikan isu ini, rujukan kepada perwakilan itu perlu disimpan selagi mata kail terpasang. Ini boleh dicapai dengan menugaskan perwakilan kepada medan atau harta dalam kelas atau contoh. Contohnya:
private static LowLevelKeyboardProc _proc; public static IntPtr SetHook(LowLevelKeyboardProc proc) { _proc = proc; using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, _proc, GetModuleHandle(curModule.ModuleName), 0); } }
Dengan menugaskan perwakilan ke medan _proc, kami memastikan ia kekal hidup selagi kaedah SetHook dipanggil. Ini menghalang pemungut sampah daripada mengutip perwakilan dan memastikan panggilan balik terus dipanggil.
Atas ialah kandungan terperinci Mengapa Cangkuk Papan Kekunci Global WPF C# Saya Berhenti Berfungsi, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!