2010-06-15 31 views
1

我們有一個大的WinForms應用程序,並且有一個內置的錯誤報告系統,可以在測試期間通過F5鍵激活。我使用.Net的PreFilterMessage系統捕獲F5密鑰。這適用於主窗體,模式對話框等。當消息框啓動時捕獲擊鍵(例如功能鍵)

不幸的是,該程序還會在需要時顯示窗口消息框。當出現錯誤時(例如,消息框中出現錯誤的文本或者它不應該存在)時,當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 

非常感謝。

回答

2

IMessageFilter s爲一個.net特徵和由.NET消息循環被調用。

由於MessageBox.Show運行本地消息循環(在MessageBox API調用中),因此不會在其中調用IMessageFilter

您需要製作鍵盤鉤,like this

+0

謝謝 - 仍然是一個複雜的解決方案,但這是一個很好的庫。 – FastAl 2010-06-16 16:18:34