我有一个非常简单的应用程序,包含表单,richedit和菜单。我正在尝试自动将文本保存在richedit上并执行其他任务,但是当应用程序处于空闲状态时仅 - 当用户没有写入或应用程序丢失焦点或其他任何内容时。
我尝试使用互联网上的大量示例代码创建OnIdle
事件处理程序,但事实恰恰相反,当我 使用该应用时,它会激活。这个link就是一个例子。
我还使用了一个计时器并检查用户最后一次写入richedit的时间,但是如果可能的话我宁愿不使用计时器。
任何人都知道如何检测应用程序是否空闲并运行某些代码?我正在使用delphi 7。
答案 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;
使用此