Rumah > pembangunan bahagian belakang > C++ > Mengapa Cangkuk Papan Kekunci Global WPF C# Saya Berhenti Berfungsi, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Cangkuk Papan Kekunci Global WPF C# Saya Berhenti Berfungsi, dan Bagaimana Saya Boleh Membetulkannya?

Mary-Kate Olsen
Lepaskan: 2025-01-05 05:57:39
asal
342 orang telah melayarinya

Why Does My WPF C# Global Keyboard Hook Stop Working, and How Can I Fix It?

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);
    }
}
Salin selepas log masuk

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);
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan