Rumah >pembangunan bahagian belakang >C++ >Mengapa Pengendali Acara Tetikus Global Saya Tidak Menyala dalam .NET Framework 4 pada Versi Windows Lebih Awal Daripada 8?

Mengapa Pengendali Acara Tetikus Global Saya Tidak Menyala dalam .NET Framework 4 pada Versi Windows Lebih Awal Daripada 8?

Susan Sarandon
Susan Sarandonasal
2025-01-15 06:04:511026semak imbas

Why Doesn't My Global Mouse Event Handler Fire in .NET Framework 4 on Windows Versions Earlier Than 8?

Pengendalian Acara Tetikus Global dalam Rangka Kerja .NET 4

Artikel ini menangani isu biasa yang dihadapi semasa melaksanakan pengendali acara tetikus global dalam aplikasi .NET Framework 4 yang dijalankan pada versi Windows sebelum Windows 8. Masalah timbul daripada cara CLR mengendalikan pengendalian modul tidak terurus untuk perhimpunan terurus.

Kod berikut menunjukkan pendekatan biasa untuk menangkap peristiwa tetikus global, yang sering gagal pada sistem Windows yang lebih lama:

<code class="language-csharp">public static class MouseHook
{
    public static event EventHandler MouseAction = delegate { };
    // ... other code ...
}</code>

Masalah utama terletak pada bahagian ini:

<code class="language-csharp">return SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle(curModule.ModuleName), 0);</code>

Pada .NET Framework 4 dan versi Windows yang lebih lama, GetModuleHandle(curModule.ModuleName) mungkin mengembalikan pemegang yang tidak sah kerana CLR tidak lagi menyediakan pemegang modul tidak terurus simulasi secara automatik untuk pemasangan terurus. Kekurangan pengendalian ralat dalam kod asal menutupi kegagalan ini. API Win32 tidak mengeluarkan pengecualian, yang membawa kepada kegagalan senyap.

Penyelesaian melibatkan semakan ralat yang mantap dan cara yang lebih dipercayai untuk mendapatkan pemegang modul. Daripada bergantung pada curModule.ModuleName, kami boleh menggunakan modul dimuatkan yang diketahui, seperti user32.dll, yang sentiasa ada dalam aplikasi .NET:

<code class="language-csharp">IntPtr hook = SetWindowsHookEx(WH_MOUSE_LL, proc, GetModuleHandle("user32"), 0);
if (hook == IntPtr.Zero)
{
    throw new System.ComponentModel.Win32Exception();
}
return hook;</code>

Kod yang disemak ini secara eksplisit menyemak nilai pulangan IntPtr.Zero daripada SetWindowsHookEx, melontar Win32Exception jika pemasangan cangkuk gagal. Ini menyediakan pelaporan ralat yang jelas dan menghalang kegagalan senyap. Menggunakan GetModuleHandle("user32") memastikan pemegang yang sah sentiasa disediakan, menyelesaikan ketidakserasian dengan versi Windows yang lebih lama. Pendekatan ini memastikan pengendalian acara tetikus global yang boleh dipercayai merentas rangkaian sistem pengendalian Windows yang lebih luas.

Atas ialah kandungan terperinci Mengapa Pengendali Acara Tetikus Global Saya Tidak Menyala dalam .NET Framework 4 pada Versi Windows Lebih Awal Daripada 8?. 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