目前我正在尝试在VBA中实现一个计时器类。为此,我使用Windows API的SetTimer和KillTimer函数...
这是来自Msdn的界面:
UINT_PTR WINAPI SetTimer(
__in_opt HWND hWnd,
__in UINT_PTR nIDEvent,
__in UINT uElapse,
__in_opt TIMERPROC lpTimerFunc
);
这就是我用我的VBA模块宣布这个功能的方式:
Private Declare Function SetTimer Lib "user32" (ByVal Handle As Long, _
ByVal TimerIDHandle As Any, _
ByVal ElapseTime As Long, _
ByVal AddressOfAndYourHandlerFunctionName As Long) As Long
'TimerIDHandle is of Type Any so I can pass Nothing to the function
然后我以这种方式调用函数:
Dim TimerID As Long
TimerID = SetTimer(Application.hWndAccessApp, ByVal 0&, Timer.Timeout, AddressOf TimeOutHandler)
由于Vba不接受“空”,我尝试实施“ByVal 0&”。这是正确的方法吗? 无论如何......我从同一个应用程序中多次调用此函数,并且函数总是返回1作为标识符,即使根据Msdn,函数应该为当前的Window句柄中创建的每个计时器返回一个唯一的ID。访问应用程序。
此外,当我只创建一个定时器时,Callback函数被调用,但Timer ID为0,而Settimer-Function在初始化时返回1。 这是我的回调函数标题:
Private Sub TimeOutHandler(ByVal WindowHandle As Long, _
ByVal TimerMessage As Long, _
ByVal TimerID As Long, _
ByVal ElapsedTime As Long)
我哪里错了?
当然,非常感谢任何帮助; - )
答案 0 :(得分:3)
有效。如果失败,那么它将返回0.你在回调中得到一个0的TimerID,因为你在创建计时器时为nIDEvent参数传递了0。您需要使用SetTimer返回的值来调用KillTimer()。把它想象成一个计时器“手柄”。
你永远不会让这个代码在64位模式下工作,所以只需将第二个参数声明为Long。