Rumah >pembangunan bahagian belakang >C++ >Mengapa Pengendali Peristiwa Tetikus Global Saya Tidak Melancarkan .NET 4 pada Windows Lama?

Mengapa Pengendali Peristiwa Tetikus Global Saya Tidak Melancarkan .NET 4 pada Windows Lama?

DDD
DDDasal
2025-01-15 06:55:43416semak imbas

Why Isn't My Global Mouse Event Handler Firing in .NET 4 on Older Windows?

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:

  1. 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.

  2. 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!

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