У нас есть большое приложение WinForms, и есть встроенная система отчетов об ошибках, которую можно активировать во время тестирования с помощью клавиши F5.Я фиксирую клавишу F5 с помощью системы .Net PreFilterMessage.Это прекрасно работает с основными формами, модальными диалоговыми окнами и т. Д.
К сожалению, программа также отображает окна сообщений, когда это необходимо.Когда есть ошибка с этим, например, неправильный текст в окне сообщения, или это не должно быть там, фильтр сообщений вообще не выполняется, когда окно сообщения работает!
Я понимаю, что мог бы исправить это, переписав собственную подпрограмму окна сообщений или запустив отдельный поток, который опрашивает GetAsyncKeyState и вызывает оттуда репортер ошибок.Однако я надеялся на метод, который был менее взломать.Вот код, который проявляет проблему:
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
Большое спасибо.