Нажатия клавиш получения (например, функциональные клавиши), в то время как messagebox произошел

У нас есть большое приложение WinForms, и существует встроенная система отчетности ошибки, которая может быть активирована во время тестирования через Ключ F5. Я получаю ключ F5 с системой PreFilterMessage .NET. Это хорошо работает на основных формах, модальных диалоговых окнах, и т.д.

К сожалению, программа также отображает окна messageboxes, когда она должна. Когда существует ошибка с этим, например, неправильный текст в messagebox, или это не должно быть там, messagefilter не выполняется вообще, когда messagebox произошел!

Я понимаю, что мог зафиксировать его или перезаписью моей собственной messagebox стандартной программы или начинанием отдельный поток, который опрашивает 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

Большое спасибо.

1
задан FastAl 15 June 2010 в 19:59
поделиться

1 ответ

IMessageFilter являются функцией .Net и вызываются циклом обработки сообщений .Net.

Поскольку MessageBox.Show запускает собственный цикл сообщений (внутри вызова API MessageBox ), фильтры IMessageFilter в нем не вызываются.

Вам нужно сделать крючок клавиатуры, вот так .

2
ответ дан 2 September 2019 в 23:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: