【问题标题】:Using vbAccelarator Win32 Hook crashes application along with VB IDE使用 vbAccelarator Win32 Hook 使应用程序与 VB IDE 一起崩溃
【发布时间】:2010-08-17 13:28:05
【问题描述】:

我正在开发 VB6 项目,我需要为工具栏控件上的按钮设置键盘快捷键。为此,我使用了来自vbAccelerator 的 Win32 Hooks 库。这是我的IWindowsHook_HookProc 函数,我用它来检索击键并根据按下的快捷方式执行操作(Ctrl + N for New,Ctrl kbd> + 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

【问题讨论】:

    标签: vb6 keyboard-hook crash


    【解决方案1】:

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

    Mark 对带有显示表单的 Timer 是正确的,因为 Hook 函数应该尽可能快地返回(

    【讨论】:

    • 我将使用计时器定期调用 HookProc 方法,但目前我的代码(如我的问题中所示的 HookProc 方法)无法识别任何关键事件,我无法理解如何让键​​盘变短- 使用 Hooks 以更实用的方式切割工具栏控件(我希望在我的主 MDI From 中的唯一控件)按钮。
    【解决方案2】:

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

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

    【讨论】:

    • 感谢您的回复,我已经从 vbAccerator 下载了完整的源代码,演示了键盘挂钩的使用,在该项目中挂钩是在标准控件的帮助下演示的。例如;表单上给出了一个文本框,作为正常行为,在聚焦控件后按下选项卡会将焦点转移到下一个控件,但是在 Hook 的帮助下,当按下 Tab 时,文本框的文本会像任何文字处理器一样被选项卡。我使用了类似的逻辑,但使用了工具栏控件,并且由于我的主 MDI 表单不需要菜单栏,因此我只需要为工具栏按钮设置快捷方式。
    【解决方案3】:

    我找到了解决我自己问题的方法,如果不小心处理,它仍然容易崩溃,但现在我的应用程序实际上响应了我想要的组合键,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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 2011-04-27
      • 1970-01-01
      • 2016-10-24
      • 2016-04-02
      相关资源
      最近更新 更多