GetLastInputInfo 和 GetTickCount 彼此不一致
GetLastInputInfo and GetTickCount are not consistent with each other
我正在尝试从 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
在运行之间,它们的变化量大致相同,但它们之间有一个我没有预料到的较大的常数偏移量。
我错过了什么?
再一次,发帖到 Stack Overflow 是找到我自己问题答案的最快方法。
这是一个翻车问题。
当mod232.
时两个值非常相似
GetTickCount64 是一个更好的调用,但它不包含在 win32API 中。
仔细观察这些数字,这是 signed/unsigned 不匹配。
3978299058 = 0xED2006B2
-316668238(二进制补码)= 0xED2006B2
3978316717 = 0xED204BAD
-316650501(二进制补码)= 0xED204BFB
所以时间是一致的,只是 win32.GetTickCount
将滴答计数解释为带符号的 32 位整数,而 win32.GetLastInputInfo
将其解释为无符号整数。
(具体来说,GetLastInputInfo
使用 PyLong_FromUnsignedLong
而 GetTickCount
将 DWORD
转换为 long
然后调用 Py_BuildValue
。你可能要考虑提交错误,因为滴答计数 应该 是一个无符号值。)
我正在尝试从 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
在运行之间,它们的变化量大致相同,但它们之间有一个我没有预料到的较大的常数偏移量。
我错过了什么?
再一次,发帖到 Stack Overflow 是找到我自己问题答案的最快方法。
这是一个翻车问题。
当mod232.
时两个值非常相似GetTickCount64 是一个更好的调用,但它不包含在 win32API 中。
仔细观察这些数字,这是 signed/unsigned 不匹配。
3978299058 = 0xED2006B2
-316668238(二进制补码)= 0xED2006B2
3978316717 = 0xED204BAD
-316650501(二进制补码)= 0xED204BFB
所以时间是一致的,只是 win32.GetTickCount
将滴答计数解释为带符号的 32 位整数,而 win32.GetLastInputInfo
将其解释为无符号整数。
(具体来说,GetLastInputInfo
使用 PyLong_FromUnsignedLong
而 GetTickCount
将 DWORD
转换为 long
然后调用 Py_BuildValue
。你可能要考虑提交错误,因为滴答计数 应该 是一个无符号值。)