0

我正在开发 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
4

3 回答 3

2

在 IDE 中使用钩子会导致大量崩溃,在不完全了解您在做什么的情况下使用钩子会导致大量崩溃期......

Mark 对带有显示表单的 Timer 是正确的,因为 Hook 函数应该尽可能快地返回(< 50 ms),否则您将很快陷入死锁(和崩溃的应用程序)。永远不要在 Hook 过程中设置断点,否则你会杀死你的 IDE(可能会崩溃,可能会挂起,可能会出现一些奇怪的状态,因为你永远无法离开断点并且无法停止调试)。如果您有大量要基于按键运行的长时间运行的功能,则设置一组要在计时器中执行的操作。使用钩子库非常强大,但强大的功能会带来巨大的崩溃......

于 2010-08-17T18:06:02.097 回答
1

HookProc我对那个钩子库没有经验,但我猜你应该在过程本身做很少的事情。直接从 Windows API 调用您,而不是通过 VB6 运行时调用。正如您所描述的那样,显示表单会使所有内容崩溃,我并不感到惊讶。vbAccelerator 网站上是否有关于要输入哪种代码的建议HookProc?顺便说一句,vbAccelerator 是一个很棒的网站。

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

于 2010-08-17T15:47:09.667 回答
0

我找到了我自己的问题的解决方案,如果不小心处理,它仍然容易崩溃,但现在我的应用程序实际上响应了我想要的组合键,Ctrl+ NCtrl+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
于 2010-08-18T09:33:07.313 回答