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
Mary-Kate Olsenasal
2025-01-05 05:57:39355semak imbas

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);
    }
}

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!

Kenyataan:
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