SetTimer IDEvent返回值问题

时间:2012-04-06 13:04:55

标签: winapi vba timer

目前我正在尝试在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)

我哪里错了?

当然,非常感谢任何帮助; - )

1 个答案:

答案 0 :(得分:3)

有效。如果失败,那么它将返回0.你在回调中得到一个0的TimerID,因为你在创建计时器时为nIDEvent参数传递了0。您需要使用SetTimer返回的值来调用KillTimer()。把它想象成一个计时器“手柄”。

你永远不会让这个代码在64位模式下工作,所以只需将第二个参数声明为Long。