Tenemos algunos ganchos de teclado globales instalados a través de SetWindowsHookEx
con WH_KEYBOARD_LL
que parecen ser descolgados aleatoriamente por Windows.¿Qué puede hacer que Windows desenganche un gancho de teclado de bajo nivel (global)?
Verificamos que engancharon ya no se adjuntó porque llamar UnhookWindowsHookEx
en el mango devuelve false
. (También se verificó que devuelve true
cuando estaba funcionando correctamente)
Parece que no hay una reproducción coherente, he oído que se pueden desenganchar debido a tiempos de espera o excepciones que se lanzan, pero lo he intentado ambos dejaron que se sentara en un punto crítico en el método de manejo durante más de un minuto, y arrojaron una excepción aleatoria (C#) y aún parece funcionar.
En nuestra devolución de llamada, publicamos rápidamente en otro hilo, por lo que probablemente no sea el problema. He leído sobre soluciones en Windows 7 para configurar el tiempo de espera más alto en el registro porque Windows 7 es más agresivo con los tiempos de espera aparentemente (todos estamos ejecutando Win7 aquí, así que no estoy seguro si esto ocurre en otros sistemas operativos), pero eso no Parece una solución ideal.
He considerado tener un subproceso en segundo plano para actualizar el anzuelo de vez en cuando, lo que es hackish, pero no sé de ninguna consecuencia negativa real de hacer eso, y parece mejor que cambiar un configuración global del registro de Windows.
¿Alguna otra sugerencia o solución? Tanto la clase que establece los ganchos como los delegados a los que están conectados son estáticos, por lo que no deberían recibir GC'd.
EDITAR: Verificado con llamadas al GC.Collect();
que todavía funcionan, por lo que no se van a recoger con garbaged.
Tener el hilo que hizo la llamada de salida SetWindowsHookEx o terminar lo hará. –
@Hans Eso no es para nosotros, pero podría ayudar a alguien más. Se conectan justo antes de 'Application.Run' y se desenganchan inmediatamente después. – Davy8
Parece recordar que los hilos gestionados no son 1: 1 con hilos no gestionados. Tal vez el hilo no administrado terminó? – user7116