Abbiamo alcuni ganci per tastiera globali installati tramite SetWindowsHookEx
con WH_KEYBOARD_LL
che sembrano essere sganciati casualmente da Windows.In che modo Windows può sganciare un gancio della tastiera di livello basso (globale)?
Abbiamo verificato che il gancio non fosse più collegato perché chiamare UnhookWindowsHookEx
sul manico restituisce false
. (Verificato anche che restituisce true
quando funzionava correttamente)
Non sembra esserci una riproduzione coerente, ho sentito che possono essere sganciati a causa di timeout o eccezioni generate, ma ho provato sia solo lasciandolo sedere su un punto di interruzione nel metodo di gestione per più di un minuto, sia semplicemente lanciando un'eccezione casuale (C#) e sembra ancora funzionare.
Nel nostro callback pubblichiamo rapidamente su un'altra discussione, quindi probabilmente non è questo il problema. Ho letto delle soluzioni in Windows 7 per impostare il timeout più alto nel registro perché Windows 7 è apparentemente più aggressivo sui timeout (stiamo tutti eseguendo Win7 qui, quindi non sono sicuro che ciò avvenga su altri sistemi operativi), ma ciò non funziona sembra una soluzione ideale
Ho considerato di avere un thread in background in esecuzione per aggiornare l'hook di tanto in tanto, che è un hacker, ma non conosco alcuna reale conseguenza negativa di farlo, e sembra meglio che modificare un impostazioni globali del registro di Windows.
Altri suggerimenti o soluzioni? Sia la classe che imposta i hook che i delegati a cui sono collegati sono statici, quindi non dovrebbero ricevere il GC.
MODIFICA: verificato con le chiamate a GC.Collect();
che funzionano ancora, in modo che non vengano raccolti garbaged.
Avendo il thread che ha effettuato l'uscita chiamata SetWindowsHookEx o terminare lo farà. –
@Hans Questo non è per noi, ma potrebbe aiutare qualcun altro. Sono agganciati subito prima di 'Application.Run' e sganciati subito dopo. – Davy8
Mi sembra di ricordare che i thread gestiti non sono 1: 1 con thread non gestiti. Forse il thread Unmanaged è terminato? – user7116