使用vbAccelarator Win32 Hook会将应用程序与VB IDE一起崩溃

时间:2010-08-17 13:28:05

标签: vb6 keyboard-hook crash

我正在开发VB6项目,我需要为工具栏控件上的按钮设置键盘快捷键。为此,我使用了vbAccelerator中的Win32 Hooks库。这是我的IWindowsHook_HookProc函数,用于检索键击和&根据按下的快捷键执行操作(Ctrl + N表示新建,Ctrl + O表示打开,Ctrl + S表示保存),但我不知道将我的应用程序与VB6 IDE一起崩溃的代码有什么问题。该功能目前尚未完成,因为我只是尝试识别“Ctrl + N”组合键以测试此功能。请帮帮我....: - |

Private Function IWindowsHook_HookProc(ByVal eType As EHTHookTypeConstants, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long, bConsume As Boolean) As Long
If KeyboardlParam(lParam).KeyDown Then
     Select Case True
           Case Me.ActiveControl = Me
                 If wParam = vbKeyControl + vbKeyN Then
                        frmNewReport.show
                        bConsume = True
                 End If
     End Select
End If

3 个答案:

答案 0 :(得分:2)

在IDE中使用一个钩子会导致很多崩溃,使用一个钩子而不完全理解你在做什么会导致很多崩溃时间...

Mark对于带有show表单的Timer是正确的,因为Hook函数应尽可能快地返回(<50 ms),否则你很快就会遇到死锁(和崩溃的应用程序)。永远不要在Hook程序中设置一个断点,否则你会杀死你的IDE(可能是崩溃,可能是挂起的,也许是一些奇怪的状态,你永远不会留下断点,你不能停止调试)。如果您想要基于按键运行大量长时间运行的功能,则设置要在计时器中执行的一系列操作。使用钩子库是非常强大的,但强大的功能会导致很大的崩溃......

答案 1 :(得分:1)

我没有使用该钩子库的经验,但我的猜测是你应该在HookProc程序本身做很少的事情。您是直接从Windows API调用的,而不是通过VB6运行时调用。我并不感到惊讶,因为你所描述的表现形式会崩溃一切。在vbAccelerator网站上有关于在HookProc中放入什么类型代码的建议吗?顺便说一句,vbAccelerator是一个很棒的网站。

我建议您在某处设置一个标志变量,以指示应显示frmNewReport。你应该有一个Timer以短的间隔,例如100毫秒运行,它检查标志变量:如果设置了标志,清除标志并显示表格。

答案 2 :(得分:0)

我已经找到了我自己的问题的解决方案,如果不仔细处理它仍然容易崩溃,但现在我的应用程序实际上响应了我想要的组合键,Ctrl + N,Ctrl + O等。 以下是我纠正的代码,据我所知,它可以正常工作。如果你发现任何导致我的应用程序崩溃的错误,请建议。

Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Property Get CtrlPressed() As Boolean
   CtrlPressed = (GetAsyncKeyState(vbKeyControl) <> 0)
End Property

Private Function IWindowsHook_HookProc(ByVal eType As EHTHookTypeConstants, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long, bConsume As Boolean) As Long

If wParam = vbKeyN Then
    If CtrlPressed Then
        LoadFormNewReport 'Method that opens Child Form 'New Report'
    End If
    bConsume = True

ElseIf wParam = vbKeyS Then
    If CtrlPressed Then
        SaveNewReport 'Method that saves new Report
    End If
    bConsume = True

ElseIf wParam = vbKeyF5 Then
    If Not CtrlPressed Then
        frmSettings.Show 'This form needs to be displayed Modally but if tried so then crashes application along with VB  IDE, other short-cuts work fine.
        bConsume = True
    End If

End If

End Function