Implementazione pura C# Hook
Per implementare i system hook, in realtà è molto semplice: basta chiamare le tre API Win32. SetWindowsHookEx viene usato per impostare i hook. (Prepara una scheda per controllare le informazioni necessarie)
CallNextHookEx viene usato per passare hook (i messaggi sono importanti, quindi da dove provengono dovrebbero tornare dove vuoi bloccarli)
Scollega WindowsHookEx Disinstalla i hook (disinstallare è molto importante, troppe impostazioni bloccate causeranno congestione)
L'articolo "HOW TO: Setting Window Hooks in Visual C# .NET" lo descrive come segue: I hook globali non sono supportati nel framework .NET Non puoi implementare ganci globali nel framework Microsoft .NET. Per installare un hook globale, il hook deve avere un'esportazione nativa della libreria dinamica (DLL) in modo che possa essere inserito in un altro processo che deve essere chiamato in una funzione valida e coerente. Questo richiede un'esportazione DLL, che non è supportata dal framework .NET. Il codice gestito non ha il concetto di avere un valore uniforme per i puntatori di funzione, perché queste funzioni sono proxy costruiti dinamicamente. Ho trovato molto codice su Internet, e la maggior parte contiene una DLL C++ per identificare la DLL che contiene la subroutine a cui si fa riferimento lpfn, il che sembra confermare questa affermazione.
Ma in realtà, non è così, e il gancio globale può essere implementato usando il seguente codice: IntPtr pInstance = Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly(). ManifestModule ); Win32API.SetWindowsHookEx( WH_MOUSE_LL,m_MouseHookProcedure, pInstance, 0 ); Nota: La proprietà ManifestModule è una nuova aggiunta nel .Net Framework 2.0, quindi quando continui a usare . In Net Framework 1.x, puoi usare il metodo GetModules per ottenere tutti i moduli dell'assembly corrente, e poi usarne uno come parametro per il metodo GetHINSTAN per ottenere il puntatore appropriato.
|