Menyelesaikan Masalah Pengendali Acara Tetikus Global dalam Versi .NET Lama
Isu:
Pengendali acara tetikus global, dilaksanakan menggunakan kaedah biasa, gagal mencetuskan peristiwa dalam .NET Framework 4 dan versi terdahulu.
Penjelasan:
Masalahnya berpunca daripada menggunakan GetModuleHandle(curModule.ModuleName)
dalam panggilan SetWindowsHookEx
. Dalam .NET 4 dan lebih awal, pada versi Windows sebelum Windows 8, Common Language Runtime (CLR) tidak menjana pemegang modul tidak terurus untuk perhimpunan terurus. Akibatnya, GetModuleHandle(curModule.ModuleName)
mengembalikan pemegang yang tidak sah, menghalang SetWindowsHookEx
daripada mendaftarkan cangkuk.
Penyelesaian:
Penyelesaian melibatkan penyediaan pemegang modul yang sah kepada SetWindowsHookEx
, walaupun ia tidak begitu diperlukan untuk cangkuk tetikus peringkat rendah. Inilah kod yang diperbetulkan:
<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 disemak ini memperoleh pemegang untuk user32.dll
, modul yang dimuatkan secara konsisten dalam aplikasi .NET. Ini memastikan pemegang yang sah untuk SetWindowsHookEx
. Pengendalian ralat dipertingkatkan dengan melontar Win32Exception
jika panggilan fungsi gagal.
Atas ialah kandungan terperinci Mengapa Pengendali Acara Tetikus Global Saya Tidak Menyala dalam .NET 4 dan Versi Terdahulu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!