Rumah >pembangunan bahagian belakang >C++ >Mengapakah Papan Kekunci Global Saya Cangkuk dalam C# Berhenti Berfungsi Selepas Ketukan Kekunci Berkekalan?
Menggunakan Cangkuk Papan Kekunci Global (WH_KEYBOARD_LL) dalam WPF / C#
Kod yang disediakan bertujuan untuk mewujudkan cangkuk papan kekunci global menggunakan cangkuk WH_KEYBOARD_LL untuk menangkap dan memproses acara papan kekunci. Walaupun pelaksanaan pada dasarnya mencapai kefungsian yang dimaksudkan, isu penting timbul: selepas tempoh ketukan kekunci yang berterusan, pengendalian acara terhenti secara tiba-tiba.
Tingkah laku ini mencadangkan masalah penjalinan yang berpotensi. Untuk menyelesaikan masalah ini, kami perlu memastikan bahawa perwakilan panggil balik kekal hidup selagi cangkuk masih ada.
Analisis Masalah
Perwakilan panggil balik, HookCallback, adalah ditakrifkan sebaris dalam kaedah SetHook. Akibatnya, perwakilan layak untuk kutipan sampah sebaik sahaja kaedah itu keluar. Apabila ini berlaku, cangkuk akan berhenti menerima panggilan balik, yang membawa kepada penamatan pengendalian acara yang diperhatikan.
Penyelesaian
Untuk membetulkannya, kita perlu menyimpan rujukan kepada perwakilan dan memastikan hayatnya bertepatan dengan kewujudan mata kail. Berikut ialah kod yang disemak yang menangani isu ini:
using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.CompilerServices; using System.Windows.Input; namespace MYCOMPANYHERE.WPF.KeyboardHelper { public class KeyboardListener : IDisposable { private static IntPtr hookId = IntPtr.Zero; private InterceptKeys.LowLevelKeyboardProc callback; public KeyboardListener() { callback = HookCallback; hookId = InterceptKeys.SetHook(callback); } [MethodImpl(MethodImplOptions.NoInlining)] private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { try { return HookCallbackInner(nCode, wParam, lParam); } catch { Console.WriteLine("There was some error somewhere..."); } return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam); } private IntPtr HookCallbackInner(int nCode, IntPtr wParam, IntPtr lParam) { // ... (original code here) return InterceptKeys.CallNextHookEx(hookId, nCode, wParam, lParam); } // ... (rest of the class) } }
Dalam kod yang dikemas kini ini, perwakilan LowLevelKeyboardProc (panggilan balik) kini merupakan medan kelas KeyboardListener. Dengan mengekalkan rujukan ini, kami memastikan bahawa perwakilan kekal hidup dan tersedia untuk panggilan balik sepanjang hayat cangkuk.
Dengan menangani isu penjalinan dengan cara ini, cangkuk papan kekunci global akan terus menangkap dan memproses acara papan kekunci dengan pasti , walaupun dalam senario ketukan kekunci tanpa henti.
Atas ialah kandungan terperinci Mengapakah Papan Kekunci Global Saya Cangkuk dalam C# Berhenti Berfungsi Selepas Ketukan Kekunci Berkekalan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!