SetTimer IDEvent 返回值问题
Posted
技术标签:
【中文标题】SetTimer IDEvent 返回值问题【英文标题】:SetTimer IDEvent return Value Problems 【发布时间】:2012-04-06 13:04:55 【问题描述】:目前我正在尝试在 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 不接受“Null”,我尝试实现“ByVal 0&”。这是正确的方法吗? 无论如何...我从同一个应用程序中多次调用此函数,并且该函数始终返回 1 作为标识符,尽管根据 Msdn 的说法,该函数应该为在当前窗口句柄中创建的每个计时器返回一个唯一 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)
我哪里错了?
当然非常感谢任何帮助;-)
【问题讨论】:
【参考方案1】:成功了。如果失败,那么它将返回 0。您在回调中为 TimerID 获得一个 0,因为您在创建计时器时为 nIDEvent 参数传递了一个 0。您需要使用 SetTimer 返回的值来调用 KillTimer()。将其视为计时器“句柄”。
你永远不会让这段代码在 64 位模式下工作,所以只需将第二个参数声明为 Long。
【讨论】:
是的,我知道它有效,但是如果我在当前访问窗口上有一个正在运行的计时器(返回的 IDEvent = 1),并且想要使用我也用于第一个的窗口句柄来获得第二个计时器timer 然后 SetTimer 仍然返回 1,即使它应该给我一个不同的 IDEvent 句柄。或者我可以选择我想要的任何 IDEvent 吗?这可能会引起麻烦,因为我不知道 Access 在其窗口上使用了哪些 Timer ID...顺便说一句:我将 NULL 传递给 SetTimer,而不是 0 ;-) 如果你想要 另一个 计时器,那么你必须为 nIDEvent 传递一个不同的值。如果您使用相同的计时器(在您的 sn-p 中为 0),那么您只需返回相同的计时器。 所以它可以是我想要的任何值?如果 Access 的 Window 中运行了我不知道 ID 的 Timer,会不会发生冲突? 是的,如果 HWND 指的是 Access 拥有的窗口,这在技术上是可行的。我猜微软程序员做对了,并使用原子而不是整数 ID 来避免这种事故。我不知道事实。 很好的帮助...谢谢!我将使用我的 Timer-Objects 的对象指针来定义希望相对唯一的 ID...以上是关于SetTimer IDEvent 返回值问题的主要内容,如果未能解决你的问题,请参考以下文章