我试图从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_FromUnsignedLong
而GetTickCount
将DWORD
转换为long
,然后调用Py_BuildValue
。您可能想考虑提交一个bug,因为tick计数应该是一个无符号值。
再次,张贴到堆栈溢出是找到我自己的问题的答案最快的方法。
这是一个翻身问题。
这两个值在mod 2 32时非常相似。
GetTickCount64将是一个更好的调用,但它不包含在win32API中。