delphi 获取窗口和/或应用程序的空闲时间(自上次鼠标移动或击键以来的时间)

qyzbxkaa  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(176)

我希望在无人使用我的应用程序时执行后台任务(更新、备份、计算等)。
因此,我希望确定应用程序中自上次击键和/或鼠标移动以来的时间。如果在超过特定时间的时间内没有用户活动,则很有可能不会打扰用户。多线程对我来说不是一个选项。
我希望避免触及应用程序中每个组件的每一个OnMouseDown-/OnKeyPress-Event,因为这没有任何意义。
我怎样才能得到
a)自上次在Windows中输入以来的时间
B)自上次在我的应用程序中输入以来的时间

vjrehmav

vjrehmav1#

此解决方案适用于
a)自上次在Windows中输入以来的时间
每次鼠标移动或键盘输入都会将时间重置为零。

function GetTimeSinceLastUserInputInWindows(): TTimeSpan;
var
   lastInput: TLastInputInfo;
   currentTickCount: DWORD;
   millisecondsPassed: Double;
begin
  lastInput := Default(TLastInputInfo);
  lastInput.cbSize := SizeOf(TLastInputInfo);

  Win32Check( GetLastInputInfo(lastInput) );
  currentTickCount := GetTickCount();

  if (lastInput.dwTime > currentTickCount) then begin // lastInput was before 49.7 days but by now, 49.7 days have passed
    millisecondsPassed :=
      (DWORD.MaxValue - lastInput.dwTime)
      + (currentTickCount * 1.0); // cast to float by multiplying to avoid DWORD overflow
    Result := TTimeSpan.FromMilliseconds(millisecondsPassed);
  end else begin
    Result := TTimeSpan.FromMilliseconds(currentTickCount - lastInput.dwTime );
  end;
end;

https://www.delphipraxis.net/1504414-post3.html

相关问题