【发布时间】:2018-01-18 09:28:10
【问题描述】:
我们有一个程序,我们正在用 Delphi XE 编写。我有一个问题:
如果程序在我们设置为参数的持续时间内没有使用,它应该会自动返回输入屏幕。所以像windows一样,一定要有鼠标和键盘这样的控件。你能帮我解决这个问题吗?
谢谢。
【问题讨论】:
我们有一个程序,我们正在用 Delphi XE 编写。我有一个问题:
如果程序在我们设置为参数的持续时间内没有使用,它应该会自动返回输入屏幕。所以像windows一样,一定要有鼠标和键盘这样的控件。你能帮我解决这个问题吗?
谢谢。
【问题讨论】:
定期致电GetLastInputInfo。这将返回最后一个输入事件的滴答计数。然后将该输入事件的滴答计数与当前滴答计数之间的差异与您的超时时间进行比较。
这种方法的缺点是您必须处理 32 位 Windows 滴答计数的 49 天翻转问题。作为替代方案,您可以选择安装系统挂钩来监视键盘和鼠标事件。这将允许您避免 49 天翻转问题,但实施起来要复杂得多。
【讨论】:
GetLastInputInfo 之间的差值。如果该值至少与超时一样大,则锁定应用程序。否则,使用超时时间和自上次输入以来经过的时间之间的差值重新启动计时器。时钟翻转也不是问题:如果GetTickCount 返回的值小于最后一个输入,则时钟翻转,需要调整差值的计算。
Elapsed := (MAXDWORD - LastInput.dwTime) + T(其中T := GetTickCount)?
1。每当我不确定区间计算时,我都会构建最简单的边缘情况。在这种情况下,我假设LastInput.dwTime 会返回MAXDWORD,而GetTickCount 会提前一个刻度,即返回0。根据您的计算,Elapsed 应该是 0,而应该是 1。