GetLastInputInfo和GetTickCount彼此不一致

时间:2016-03-30 14:53:13

标签: python windows pywin32

我正在尝试计算当前用户在Windows机器上从Python中闲置多久(例如this question)。

为此,我想我需要将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

在两次运行之间,它们的变化量大致相同,但它们之间存在很大的常数偏移,这是我不期望的。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

仔细查看数字,这是签名/未签名的不匹配。

3978299058 = 0xED2006B2

-316668238(在两个补码中)= 0xED2006B2

3978316717 = 0xED204BAD

-316650501(两个补码)= 0xED204BFB

所以时间是一致的,只是win32.GetTickCount将滴答计数解释为带符号的32位整数,而win32.GetLastInputInfo将它解释为无符号。

(具体来说,GetLastInputInfo正在使用PyLong_FromUnsignedLong,而GetTickCount会将DWORD投射到long,然后调用Py_BuildValue。您可能需要考虑提交错误,因为滴答计数 应该是无符号值。)

答案 1 :(得分:0)

再次发布,发布到Stack Overflow是找到我自己问题答案的最快方法。

这是一个翻车问题。

当它们是mod 2 32 时,这两个值非常相似。

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