【问题标题】:Capture keystrokes (e.g., function keys) while a messagebox is up在消息框启动时捕获击键(例如,功能键)
【发布时间】:2010-06-16 04:19:21
【问题描述】:

我们有一个大型 WinForms 应用程序,并且有一个内置的错误报告系统,可以在测试期间通过 F5 键激活。我正在使用 .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

非常感谢。

【问题讨论】:

    标签: c# vb.net winforms messagebox


    【解决方案1】:

    IMessageFilters 是 .Net 功能,由 .Net 消息循环调用。

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

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

    【讨论】:

    • 谢谢 - 仍然是一个复杂的解决方案,但这是一个不错的库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2011-05-12
    • 2011-06-05
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多