我正在尝试计算当前用户在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
在两次运行之间,它们的变化量大致相同,但它们之间存在很大的常数偏移,这是我不期望的。
我错过了什么?
答案 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中。