Menyelesaikan masalah Pengendali Acara Tetikus Global dalam .NET 4 (Windows Lama)
Masalah:
Kait tetikus tersuai, direka untuk menangkap peristiwa tetikus, tidak berfungsi seperti yang diharapkan pada sistem Windows yang lebih lama apabila menggunakan .NET 4. Pengendali acara yang dilanggan kekal tidak aktif.
Penyelesaian:
Tingkah laku ini berpunca daripada perubahan dalam .NET 4 Common Language Runtime (CLR) pada sistem pengendalian pra-Windows 8. CLR tidak lagi menjana pemegang modul tidak terurus secara automatik untuk perhimpunan terurus. Selain itu, pengendalian ralat yang tidak mencukupi dalam kod asal memburukkan lagi masalah.
Panggilan SetWindowsHookEx
asal mungkin kelihatan seperti ini:
<code class="language-csharp">IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0);</code>
Ini gagal pada versi Windows lama kerana GetModuleHandle(curModule.ModuleName)
tidak mengembalikan pemegang yang sah dalam persekitaran .NET 4.
Penyelesaian melibatkan dua penambahbaikan utama:
Pengendalian Ralat Teguh: Laksanakan semakan untuk memastikan kedua-dua GetModuleHandle
dan SetWindowsHookEx
mengembalikan pemegang yang sah (bukan IntPtr.Zero
). Jika salah satu panggilan gagal, Win32Exception
harus dilemparkan untuk memberikan butiran ralat yang bermaklumat.
Pemegang Modul Dummy: Untuk cangkuk tetikus aras rendah (WH_MOUSE_LL
), pemegang modul yang dihantar ke SetWindowsHookEx
tidak digunakan secara langsung. Oleh itu, pemegang yang sedia ada, seperti pemegang user32.dll
(sentiasa dimuatkan dalam aplikasi .NET), boleh digantikan.
Berikut ialah kod yang disemak yang menggabungkan penambahbaikan ini:
<code class="language-csharp">IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle("user32"), 0); if (hook == IntPtr.Zero) { throw new System.ComponentModel.Win32Exception(); }</code>
Kod yang diperbetulkan ini memastikan pengendalian ralat yang betul dan menyediakan pemegang yang boleh dipercayai, menyelesaikan ketidakserasian dengan versi Windows lama di bawah .NET 4.
Atas ialah kandungan terperinci Mengapa Pengendali Peristiwa Tetikus Global Saya Tidak Melancarkan .NET 4 pada Windows Lama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!