使用SetTimer函数后绝对不能运行任何macros

所以我需要在我的Excel VB项目中使用SetTimer API,但是在执行间隔计时器之后,只要您尝试运行另一个macros,程序就会崩溃。 即使只需单击“开发人员”选项卡中的macrosbutton。 代码:

Public Declare Function SetTimer Lib "user32" ( _ ByVal HWnd As Long, _ ByVal nIDEvent As Long, _ ByVal uElapse As Long, _ ByVal lpTimerFunc As Long) As Long Public Declare Function KillTimer Lib "user32" ( _ ByVal HWnd As Long, _ ByVal nIDEvent As Long) As Long Public timId As Long, lala As Long, i As Integer Public Sub CallTm() timId = SetTimer(0, 0, 100, AddressOf Test) End Sub Public Sub AnotherSub() MsgBox "This is not gonna be shown" End Sub Public Sub Test() Cells(1, 1).Value = i i = i + 1 End Sub 

看来这不是KillTimer的问题。 用SetTimer简单地设置时间间隔就像是一个确保没有更多的macros可以运行的开关(或者如果你尝试的话就会崩溃)。 我记得看到错误50290,如果这是更多的帮助。

为何如此,如何解决?

顺便说一句,我正在Excel中做一个蛇的游戏,用于学校项目。

看起来像定时器设置后,由于定时器占用所有的线程,什么都不会发生? 或者这样的行为,不能被“中断”。

真的,这个API应该如何使用? 这似乎是一个致命的错误,使它完全无用…

你正在损坏堆栈,因为你的Test过程不匹配TimerProc的签名。 您应该阅读并理解API调用的文档,然后再盲目地使用它们。

您也可以在MSDN上findSetTimer的文档,就像所有其他的WinAPI文档一样。

timerPorc的原型是这样的

 VOID CALLBACK TimerProc( _In_ HWND hwnd, _In_ UINT uMsg, _In_ UINT_PTR idEvent, _In_ DWORD dwTime ); 

可以转换为vb如下

 sub Test(byval hWnd as long, byval uMsg as long,byval idIvent as long, byval dwTime as long) 'your code here end sub