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