C# 在messagebox启动时捕获击键(如功能键)

C# 在messagebox启动时捕获击键(如功能键),c#,vb.net,winforms,messagebox,C#,Vb.net,Winforms,Messagebox,我们有一个大型WinForms应用程序,并且有一个内置的bug报告系统,可以在测试期间通过F5键激活。我正在使用.Net的PreFilterMessage系统捕获F5键。这在主窗体、模态对话框等上运行良好 不幸的是,该程序在需要时也会显示windows MessageBox。当出现错误时,例如messagebox中的文本错误或不应该出现错误,messagebox启动时,messagefilter根本不会执行 我意识到我可以通过重写自己的messagebox例程,或者启动一个单独的线程轮询GetA

我们有一个大型WinForms应用程序,并且有一个内置的bug报告系统,可以在测试期间通过F5键激活。我正在使用.Net的PreFilterMessage系统捕获F5键。这在主窗体、模态对话框等上运行良好

不幸的是,该程序在需要时也会显示windows MessageBox。当出现错误时,例如messagebox中的文本错误或不应该出现错误,messagebox启动时,messagefilter根本不会执行

我意识到我可以通过重写自己的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

非常感谢。

IMessageFilter
s是.Net功能,由.Net消息循环调用

由于
MessageBox.Show
运行本机消息循环(在
MessageBox
API调用中),因此不会在其中调用
IMessageFilter
s


您需要制作一个键盘挂钩。

谢谢-这仍然是一个复杂的解决方案,但这是一个很好的库。