GetLastInputInfo和GetTickCount彼此不一致

我试图从Windows机器上的Python中计算出当前用户已经闲置了多长时间(比如这个问题 )。

要做到这一点,我想我需要比较GetLastInputInfo的结果和GetTickCount的结果。 结果应该是毫秒。

(我预计每49.7天会出现翻滚问题,但我会稍后解决。)

我的代码很简单:

import win32api last_active = win32api.GetLastInputInfo() now = win32api.GetTickCount() elapsed_milliseconds = (now - last_active) print(last_active, now, elapsed_milliseconds) 

我期望得到两个相似的大数字,相差几百毫秒。

相反,我得到如下结果:

 3978299058 -316668238 -4294967296 

 3978316717 -316650501 -4294967218 

在运行之间,它们都变化了大致相同的数量,但是它们之间有很大的不断的偏移,我不期待。

我错过了什么?

仔细查看这些数字,这是一个有符号/无符号的不匹配。

3978299058 = 0xED2006B2

-316668238(二进制补码)= 0xED2006B2

3978316717 = 0xED204BAD

-316650501(二进制补码)= 0xED204BFB

所以时间是一致的,只是win32.GetTickCount将tick计数解释为一个有符号的32位整数,而win32.GetLastInputInfo将其解释为unsigned。

(具体来说, GetLastInputInfo使用PyLong_FromUnsignedLongGetTickCountDWORD转换为long ,然后调用Py_BuildValue 。您可能想考虑提交一个bug,因为tick计数应该是一个无符号值。

再次,张贴到堆栈溢出是找到我自己的问题的答案最快的方法。

这是一个翻身问题。

这两个值在mod 2 32时非常相似。

GetTickCount64将是一个更好的调用,但它不包含在win32API中。