我们有一个大型的WinForms应用程序,并且有一个内置的错误报告系统,可以在测试期间通过F5 Key激活。我正在使用.Net的PreFilterMessage系统捕获F5密钥。这在主窗体,模式对话框等上工作正常。
不幸的是,程序还会在需要时显示Windows消息框。当存在错误时,例如,消息框中的错误文本或它不应该存在,当消息框启动时,消息过滤器根本不会被执行!
我意识到我可以通过重写我自己的消息框例程来解决它,或者启动一个单独的线程来轮询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
非常感谢。
答案 0 :(得分:2)
IMessageFilter
是.Net功能,由.Net消息循环调用。
由于MessageBox.Show
运行本机消息循环(在MessageBox
API调用内),因此不会调用IMessageFilter
。
您需要制作键盘钩子like this。