Programma che tra le altre cose esegue un hook a basso livello di tastiera e mouse, al fine di bloccare e programmare alcuni tasti di mouse e tastiera con un bel
e.Handled = True.
L' hook di tastiera funziona senza problemi. L' hook del mouse funziona bene, ma presenta un problema che trovo inspiegabile: se premo il tasto destro del mouse o i button X1 e X2 su qualsiasi finestra del desktop NON in primo piano... il thread lanciato di blocca e SI BLOCCANO TUTTI I TIMERS.TIMER DEL PROGRAMMA !! Ma che c' entrano i Timers.Timer??????
La cosa è tanto più inspiegabile in quanto
eseguo il controllo dell' hook su un altro thread! (che poi è stato un ulteriore tentativo che tutto sommato viene utile in caso di controllo hook prolungato: il problema non cambia anche sullo stesso thread).
Private Sub CheckMouse_MouseDown(sender As Object, e As CheckMouseHndl) Handles CheckMouse.MouseDown
Dim MD As New CheckMyMouse 'la Classe dove eseguo controlli e azioni
Dim Flag As New Thread(Sub() MD.MouseDown(e)) 'uso la Sub() perché devo passare un parametro
Flag.Start()
Debug.Print("Fine del thread start") 'non ci arrivo!!!!
End Sub
Private Sub CheckMouse_MouseUp(sender As Object, e As CheckMouseHndl) Handles CheckMouse.MouseUp
Debug.Print("Il mouse è stato sollevato e Timer1.Enabled è: " & Timer1.Enabled)
End Sub
A questo punto vi chiederete... si, ma il codice da elaborare?? Ebbene, togli qui togli là per cercare il problema... il codice è rimasto questo:
Friend Sub MouseDown(e As CheckMouseHndl)
Try
Return
Finally
Debug.Print("Sono arrivato al Finally dopo aver premuto: " & e.Button.ToString)
End Try
End Sub
non c' è nulla ma se premo tasto destro su una qualsiasi finestra del desktop NON IN PRIMO PIANO ecco il codice che ricevo:
Sono arrivato al Finally dopo aver premuto: Right
Cioè non ricevo il messaggio di MouseUp, e AL LIMITE ci sta,
ma non ricevo nemmeno il messaggio di fine thread anche se il Finally viene rilevato!
Fermo restando che anche se si bloccano tutti i timers del programma l' hook continua a funzionare e ricevere input da mouse.
Al momento l' unica cosa certa è che se PRIMA nella finestra premo Left e poi premo Right non ci sono problemi. Inoltre se a timers bloccati premo un bel Left dopo un Right "blocca-tutto"... i Timers si riattivano in automatico e tutto torna a funzionare senza problemi.