应用程序空闲时执行操作

时间:2010-09-16 19:33:11

标签: windows delphi

我有一个非常简单的应用程序,包含表单,richedit和菜单。我正在尝试自动将文本保存在richedit上并执行其他任务,但是当应用程序处于空闲状态时 - 当用户没有写入或应用程序丢失焦点或其他任何内容时。

我尝试使用互联网上的大量示例代码创建OnIdle事件处理程序,但事实恰恰相反,当我 使用该应用时,它会激活。这个link就是一个例子。

我还使用了一个计时器并检查用户最后一次写入richedit的时间,但是如果可能的话我宁愿不使用计时器。

任何人都知道如何检测应用程序是否空闲并运行某些代码?我正在使用delphi 7。

3 个答案:

答案 0 :(得分:3)

我还会推荐一个计时器,但会“重置”倒计时(切换然后再打开)以响应richedit中发生的任何键盘事件。这样,当用户尝试输入时,您就不会保存。

正如安德烈亚斯所指出的,这是如何实际实现这一点: 每次用户执行某些操作时,例如更改编辑器的插入符号pos,执行Timer1.Enabled:= false; Timer1.Enabled:= true。这将重置计时器。实际上,在最后一个Timer1Interval毫秒没有用户活动之前,计时器永远不会触发

答案 1 :(得分:1)

你可能最好用计时器。 OnIdle会经常开火。我相信,该消息意味着队列中的所有消息都已被处理。因此,每次处理完消息时,一旦完成,就会触发OnIdle。

您可以做的是在富编辑中的每个OnChange事件之后将变量设置为时间戳。然后,使用计时器,每X秒检查一次,看看该时间戳是否大于5秒。如果是,那么请进行保存。

答案 2 :(得分:0)

function GetIdleTime:DWORD;
var
  lastI : TLastInputInfo;
begin
  lastI.cbSize := SizeOf(lastI);
  GetLastInputInfo(lastI);
  Result := (gettickcount - lastI.dwTime) div 1000;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if GetIdleTime = 60 then Memo1.savetofile('C:\jgs.tmp');
end;

使用此