gpt4 book ai didi

winapi - SetTimer IDEvent 返回值问题

转载 作者:行者123 更新时间:2023-12-04 05:51:00 24 4
gpt4 key购买 nike

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

我哪里错了?

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

最佳答案

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

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

关于winapi - SetTimer IDEvent 返回值问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10043877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com