代码之家  ›  专栏  ›  技术社区  ›  FastAl

在消息框打开时捕获击键(例如,功能键)

  •  1
  • FastAl  · 技术社区  · 14 年前

    我们有一个大型的winforms应用程序,有一个内置的bug报告系统,可以在测试期间通过f5键激活。我正在用.NET的预过滤消息系统捕获F5键。这在主窗体、模式对话框等上工作正常。

    不幸的是,程序在需要时也会显示Windows消息框。当出现错误时,例如消息框中的文本错误或不应该出现错误时,消息框启动时根本不执行消息过滤器!

    我意识到我可以通过重写自己的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 回复  |  直到 14 年前
        1
  •  2
  •   SLaks    14 年前

    IMessageFilter S是.NET功能,由.NET消息循环调用。

    自从 MessageBox.Show 运行本机消息循环(在 MessageBox API调用) 无滤波器 它不调用s。

    你需要做一个键盘挂钩, like this .