Implementación pura de gancho en C#
Para implementar ganchos de sistema, en realidad es muy sencillo: solo hay que llamar a las tres APIs de Win32. SetWindowsHookEx se utiliza para configurar ganchos. (Crea una tarjeta para comprobar la información que necesitas)
CallNextHookEx se usa para pasar ganchos (los mensajes son importantes, así que de donde vienen deberían volver a donde quieres bloquearlos)
DesenganchaWindowsHookEx Desinstala ganchos (desinstalar es muy importante, demasiados ajustes atascados causan congestión)
El artículo "CÓMO TO: Configurar ganchos de ventana en Visual C# .NET" lo describe de la siguiente manera: Los ganchos globales no están soportados en el framework .NET No puedes implementar ganchos globales en el framework Microsoft .NET. Para instalar un hook global, el hook debe tener una exportación nativa de biblioteca de enlace dinámico (DLL) para poder insertarse en otro proceso que deba ser llamado a una función válida y consistente. Esto requiere una exportación DLL, que no es compatible con el framework .NET. El código gestionado no tiene el concepto de tener un valor uniforme para los punteros de función, porque estas funciones son proxies construidos dinámicamente. Encontré mucho código en Internet, y la mayoría contienen una DLL en C++ para identificar la DLL que contiene la subrutina a la que se refiere lpfn, lo que parece validar esta afirmación.
Pero en realidad, no es así, y el gancho global puede implementarse usando el siguiente código: IntPtr pInstance = Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly(). ManifestModule ); Win32API.SetWindowsHookEx( WH_MOUSE_LL,m_MouseHookProcedure, pInstance, 0 ); Nota: La propiedad ManifestModule es una incorporación nueva en el .Net Framework 2.0, así que cuando sigas usando . En Net Framework 1.x, puedes usar el método GetModules para obtener todos los módulos del ensamblaje actual, y luego usar uno de ellos como parámetro para el método GetHINSTAN para obtener el puntero de handle adecuado.
|