SetTimer ID解决返回值问题



目前我正在尝试在 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,该函数应为在当前 Access 应用程序的窗口句柄中创建的每个计时器返回唯一 ID。

此外,当我只创建一个计时器时,回调函数被调用,但计时器 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。 在回调中,计时器 ID 为 0,因为在创建计时器时为 nIDEvent 参数传递了 0。 你需要使用 SetTimer 返回的值来调用 KillTimer()。 可以将其视为计时器"句柄"。

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

最新更新