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.
Merci - encore une solution compliquée mais c'est une belle bibliothèque. – FastAl