Winapi GetMessageTime是否像GetTickCount一样溢出

Winapi GetMessageTime是否像GetTickCount一样溢出,winapi,Winapi,一旦值超过49.7天,是否(以及的时间成员)也会受到重置回0的相同限制?是,备注部分甚至会这样说。是,备注部分甚至会这样说。在达到相应返回值类型所能表示的最大值后,这两个部分都会返回到最小值。返回类型不一致,其中GetMessageTime返回LONG(signed int),而GetTickCount返回DWORD(unsigned int) GetMessageTime的文档调用: GetMessageTime函数的返回值在后续消息之间不一定增加,因为如果计时器计数超过长整数的最大值,则长整

一旦值超过49.7天,是否(以及的时间成员)也会受到重置回0的相同限制?

是,备注部分甚至会这样说。

是,备注部分甚至会这样说。

在达到相应返回值类型所能表示的最大值后,这两个部分都会返回到最小值。返回类型不一致,其中
GetMessageTime
返回
LONG
signed int
),而
GetTickCount
返回
DWORD
unsigned int

GetMessageTime
的文档调用:

GetMessageTime函数的返回值在后续消息之间不一定增加,因为如果计时器计数超过长整数的最大值,则长整数的值[…]将换行为最小值

由于返回值的签名性,
GetTickCount
的文档描述了一种不同的包装模式:

经过的时间存储为
DWORD
值。因此,如果系统连续运行49.7天,时间将变为零

因此,两个返回值在不同的时间点包装为不同的值<代码>GetMessageTime到达后换行到-2147483648‭2147483647‬ (大约在24.9天后),而当超过‭4294967295‬. 在初始环绕之后,两个返回值以相同的频率环绕,其中时间点移动了一个周期时间段的一半

这就是C语言的保证。由于这是Windows,我们可以限制自己使用Win32 ABI的更强大的保证,这需要两个补码算法。鉴于此,
GetMessageTime
GetTickCount
返回值的二进制表示形式是相同的。如果您决定将
GetMessageTime
的返回值强制转换为
DWORD
,您将看到与
GetTickCount
相同的值包装

我不完全清楚,为什么
GetMessageTime
返回一个有符号的值。选择它可能是为了更容易执行被认为是更常见的计算。不过,这只是猜测。Raymond Chen的博客文章提供了更多信息,但没有回答“为什么?”。

这两个问题,以及在达到相应返回值类型可以表示的最大值后,返回到最小值。返回类型不一致,其中
GetMessageTime
返回
LONG
signed int
),而
GetTickCount
返回
DWORD
unsigned int

GetMessageTime
的文档调用:

GetMessageTime函数的返回值在后续消息之间不一定增加,因为如果计时器计数超过长整数的最大值,则长整数的值[…]将换行为最小值

由于返回值的签名性,
GetTickCount
的文档描述了一种不同的包装模式:

经过的时间存储为
DWORD
值。因此,如果系统连续运行49.7天,时间将变为零

因此,两个返回值在不同的时间点包装为不同的值<代码>GetMessageTime到达后换行到-2147483648‭2147483647‬ (大约在24.9天后),而当超过‭4294967295‬. 在初始环绕之后,两个返回值以相同的频率环绕,其中时间点移动了一个周期时间段的一半

这就是C语言的保证。由于这是Windows,我们可以限制自己使用Win32 ABI的更强大的保证,这需要两个补码算法。鉴于此,
GetMessageTime
GetTickCount
返回值的二进制表示形式是相同的。如果您决定将
GetMessageTime
的返回值强制转换为
DWORD
,您将看到与
GetTickCount
相同的值包装


我不完全清楚,为什么
GetMessageTime
返回一个有符号的值。选择它可能是为了更容易执行被认为是更常见的计算。不过,这只是猜测。Raymond Chen的博客文章提供了更多信息,但没有回答“为什么?”的问题。

这种问题让我很难过。你链接到了MSDN文档,它直接回答了你提出的问题。@DavidHeffernan事实上,我觉得错过了这一部分就像个白痴一样,bleh抱歉!我从来没有想到过,但是文档和函数签名的某些地方看起来不太对劲
GetMessageTime
返回一个
LONG
(即
signed int
),但
GetTickCount
以及
KBDLLHOOKSTRUCT
的时间成员use
DWORD
s(即
unsigned int
)。我一直认为,消息时间戳设置为
GetTickCount
的结果,但鉴于上述情况,这是不可能的。有人知道这些API调用之间的关系吗?如果有的话?@IInspectable Documentation bug,请参阅。@Tirafesi+1感谢我愿意公开你的错误(以及有勇气将问题留在网站上)。你会走得很远的。这种问题让我很难过。你链接到了MSDN文档,它直接回答了你提出的问题。@DavidHeffernan的确,我觉得自己是个白痴,因为遗漏了这一部分