当Windows钩子处于活动状态时,如何防止Excel因错误而崩溃?

当Windows钩子处于活动状态时,如何防止Excel因错误而崩溃?,excel,vba,winapi,Excel,Vba,Winapi,我正在使用setWindowHookEx,它工作正常: Private HookHandle As LongPtr Sub RemoveHook() UnhookWindowsHookEx HookHandle End Sub Sub SetHook() Dim lThreadID As LongPtr lThreadID = GetCurrentThreadId HookHandle = SetWindowsHookEx(WH_MOUSE, AddressO

我正在使用setWindowHookEx,它工作正常:

Private HookHandle As LongPtr

Sub RemoveHook()
    UnhookWindowsHookEx HookHandle
End Sub

Sub SetHook()
    Dim lThreadID As LongPtr
    lThreadID = GetCurrentThreadId
    HookHandle = SetWindowsHookEx(WH_MOUSE, AddressOf foo, 0, lThreadID)
End Sub

Public Function foo(ByVal nCode As LongPtr, ByVal wParam As LongPtr, ByVal lParam As LongPtr) As LongPtr
    foo = CallNextHookEx(0, nCode , wParam, lParam)
End Function
我的问题是:当任何未处理的错误(来自任何其他宏)发生时,我必须结束宏,Excel崩溃并死亡。(我猜,那个钩子还活着,但foo函数不再在内存中)

有没有办法防止Excel崩溃


我在许多模块中使用它,我不希望到处都进行错误处理。

根据我的经验,95%的Excel崩溃都是由于内存问题造成的,这是由于对象和其他类似项目处理不当造成的。我没有使用过钩子,但是否有一种偶然的方式,你应该在使用完钩子后“释放”或“清除”或“关闭”钩子?如果是这样,则构建错误处理,以便在错误发生时立即执行该操作。另外,不要在错误恢复下一步时使用
并始终使模块
选项的第一行显式
…此外,您的第一行显示“工作正常”。。。但是,是什么导致了这些错误?@ashleedawg Hook工作得很好,但是当我在其他地方出现错误时,Excel崩溃并死亡。请在Excel的第二个实例(新的Excel.Application)中安装该钩子所以它不会被你正在调试的代码打断。我觉得你需要添加另一个钩子来拦截VBA错误。引发事件…看一看。