2010-06-15 4 views
1

Nous avons une application WinForms volumineuse et un système intégré de signalement des bogues pouvant être activé lors des tests via la touche F5. Je capture la clé F5 avec le système PreFilterMessage de .Net. Cela fonctionne correctement sur les formulaires principaux, les boîtes de dialogue modales, etc.Capturez des séquences de touches (par exemple, des touches de fonction) lorsqu'une boîte aux lettres est activée

Malheureusement, le programme affiche également les boîtes de message Windows quand il le faut. Lorsqu'il y a un bogue avec, par exemple, un mauvais texte dans la boîte de message ou il ne devrait pas être là, le messagefilter n'est pas exécuté du tout quand la boîte de message est en place!

Je réalise que je pourrais le réparer en réécrivant ma propre routine de boîte de message, ou en lançant un thread séparé qui interroge GetAsyncKeyState et appelle le reporter d'erreur à partir de là. Cependant j'espérais une méthode qui était moins un hack. Voici le code qui manifeste le problème:

Public Class Form1 
    Implements IMessageFilter 

Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click 
    MsgBox("now, a messagebox is up!") 
End Sub 

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Application.AddMessageFilter(Me) 
End Sub 

Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) _ 
As Boolean Implements IMessageFilter.PreFilterMessage 

    Const VK_F5 As Int32 = &H74 
    Const WM_KEYDOWN As Integer = &H100 

    If m.Msg = WM_KEYDOWN And m.WParam.ToInt32 = VK_F5 Then 
     ' In reality code here takes a screenshot, saves the program state, and shows a bug report interface ' 
     IO.File.AppendAllText("c:\bugs.txt", InputBox("Describe the bug:")) 
    End If 

End Function 
End Class 

Merci beaucoup.

Répondre

2

IMessageFilter s sont une fonctionnalité .Net et sont invoquées par la boucle de message .Net.

Étant donné que MessageBox.Show exécute la boucle de message natif (dans l'appel API MessageBox), les IMessageFilter ne sont pas appelés.

Vous devez créer un crochet de clavier, like this.

+0

Merci - encore une solution compliquée mais c'est une belle bibliothèque. – FastAl