Python GetLastInputInfo和GetTickCount不一致
我试图计算出当前用户在Windows机器上从Python空闲(例如,like)大约多长时间 为此,我想我需要将的结果与的结果进行比较 . 结果应以毫秒为单位 (我预计每49.7天就有一次翻车问题,但我会在以后解决。) 我的代码很简单:Python GetLastInputInfo和GetTickCount不一致,python,windows,pywin32,Python,Windows,Pywin32,我试图计算出当前用户在Windows机器上从Python空闲(例如,like)大约多长时间 为此,我想我需要将的结果与的结果进行比较 . 结果应以毫秒为单位 (我预计每49.7天就有一次翻车问题,但我会在以后解决。) 我的代码很简单: import win32api last_active = win32api.GetLastInputInfo() now = win32api.GetTickCount() elapsed_milliseconds = (now - last_active)
import win32api
last_active = win32api.GetLastInputInfo()
now = win32api.GetTickCount()
elapsed_milliseconds = (now - last_active)
print(last_active, now, elapsed_milliseconds)
我希望得到两个类似的大数字,相差几百毫秒
相反,我得到的结果如下:
3978299058 -316668238 -4294967296
及
在两次运行之间,它们的变化量大致相同,但它们之间有一个很大的恒定偏移量,这是我没有预料到的
我遗漏了什么?再一次,发布到堆栈溢出是找到我自己问题答案的最快方法 这是一个翻车问题 这两个值在mod 232时非常相似
GetTickCount64是一个更好的调用,但它没有包含在win32API中。仔细看数字,这是一个有符号/无符号的不匹配 3978299058=0xED2006B2 -316668238(二者的补码)=0xED2006B2 3978316717=0xED204BAD -31665051(二者的补码)=0xED204BFB 因此时间是一致的,只是
win32.GetTickCount
将滴答计数解释为有符号32位整数,而win32.GetLastInputInfo
将其解释为无符号整数
(具体地说,代码> GETLASTIN PATIOFION/CODE >使用<代码> PyLang-FurMangSigNeNeNe//C> >而<代码> GETICKCOUNT < /代码>将<代码> dWord <代码>转换为<代码> long < /Cord>,然后调用<代码> PyBuuBudValue。您可能需要考虑提交一个bug,因为TITK计数应该是无符号值。
我不认为使用GetTickCount64会有帮助,因为根据文档,GetLastInputInfo只返回32位的滴答计数。我理解这一理论,但检查pywin32代码(win32apimule.cpp:1671)时,它说“从unsignedlong(lii.dwTime)返回PyLong_”;这看起来是正确的。是的,我应该更仔细地看一下实际数字。问题很简单,一个值返回为unsigned,另一个返回为signed。谢谢3978316717 -316650501 -4294967218