GetMessageTime (因此,KBDLLHOOKSTRUCT的时间成员也有相同的限制,即当值超过49.7天时,GetTickCount会将其重新分配到0吗?)
发布于 2018-07-11 09:25:10
GetMesssageTime和GetTickCount在达到可以由各自的返回值类型表示的最大值后,都会换到最小的值。返回类型存在不一致性,其中GetMessageTime返回LONG (signed int),GetTickCount返回DWORD (unsigned int)。
GetMessageTime的文档要求:
来自GetMessageTime函数的返回值不一定在后续消息之间增加,因为如果计时器计数超过长整数的最大值,则值.包装为长整数的最小值。
由于返回值的签名性,GetTickCount的文档描述了一种不同的包装模式:
经过的时间存储为
DWORD值。因此,如果系统连续运行49.7天,的时间将变为零,。
因此,两个返回值都在不同的时间点换到不同的值。GetMessageTime在达到2147483647(大约在24.9天后)后将包装为-2147483648,而当超过4294967295时,GetTickCount包装为0。在初始环绕之后,两个返回值以相同的频率环绕,其中时间点被移动了一个周期的一半时间周期。
这就是C语言的保证。由于这是视窗,我们可以限制自己的Win32 ABI的更强有力的保证,这需要两个补码算法。因此,GetMessageTime和GetTickCount的返回值的二进制表示是相同的。如果您决定将GetMessageTime的返回值转换为DWORD,您将观察到该值的包装与来自GetTickCount的相同。
我并不完全清楚为什么GetMessageTime会返回一个有符号的值。它的选择可能是为了让人们更容易地进行被认为是更常见的计算。不过,这是猜测。雷蒙德·陈的博客文章MSG.time和GetMessageTime使用什么时钟?有更多的信息,但没有回答“为什么”这个问题。
发布于 2018-07-10 15:12:22
是的,评论部分甚至这么说。
https://stackoverflow.com/questions/51268459
复制相似问题