GetMessageTime(因此,KBDLLHOOKSTRUCT的 time 成员)是否受到GetTickCount相同的限制,一旦价值跨越 49.7 天?
答案 0 :(得分:2)
是的,备注部分甚至是这样。
答案 1 :(得分:2)
GetMesssageTime和GetTickCount都在达到最大值(由相应的返回值类型表示)之后回绕到最小值。返回类型不一致,其中GetMessageTime
返回LONG
(signed int
),而GetTickCount
返回DWORD
(unsigned int
)。
GetMessageTime
的文档要求:
GetMessageTime函数的返回值不一定会在后续消息之间增加,因为如果计时器计数超过长整数的最大值,则值[...] 将换为长整数的最小值。
由于返回值的签名,GetTickCount
的文档描述了一种不同的包装模式:
经过的时间存储为
DWORD
值。因此,如果系统连续运行49.7天,该时间将回绕为零。
因此,两个返回值在不同的时间点包装为不同的值。 GetMessageTime
在达到2147483647之后(大约在24.9天后)回绕为-2147483648,而当{1}}达到4294967295时回绕为0。初始回绕之后,两个返回值都以相同的频率回绕,其中时间点偏移一个周期的一半时间。
这是对C语言的保证。由于这是Windows,因此我们可以将自己限制在Win32 ABI的更强保证上,这需要二进制补码算法。鉴于此,GetTickCount
和GetMessageTime
的返回值的二进制表示形式是相同的。如果决定将GetTickCount
的返回值强制转换为GetMessageTime
,则将观察到与DWORD
相同的值换行。
我尚不完全清楚为什么GetTickCount
返回带符号的值。选择它可能是为了使其更容易执行被认为是更常见的计算。不过那是猜测。 Raymond Chen的博客条目What clock do MSG.time and GetMessageTime use?提供了更多信息,但没有回答问题“为什么?” 。