判断程序闲置了多久 ( 积分: 30 )

  • 主题发起人 主题发起人 siaosa
  • 开始时间 开始时间
S

siaosa

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样判断程序闲置了多久没有任何操作? 不是操作系统闲置了多久
 
用个变量记录

var
IdleTime: DWord;

Application.OnIdle
IdleTime := GetTickCount;

判断
ShowMessage('程序已闲置' + IntToStr(GetTickCount - IdleTime) + '毫秒');
 
做个标记。
 
如果能取任务管理器中进程的信息就好了,上面有cpu的利用时间,然后用软件运行的总时间减去,就能准确得到空闲时间.
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure MyOnIdle(Sender:TObject;var Done:Boolean);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
IdleBegin:DWord;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyOnIdle(Sender: TObject; var Done: Boolean);
begin
if IdleBegin=0 then
IdleBegin:=gettickcount();
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:=IntToStr(GetTickCount-IdleBegin);
IdleBegin:=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle:=MyOnIdle;
end;
end.
 
用GetTickCount的方法不行
var
IdleTime: DWord;

procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
begin
IdleTime := GetTickCount;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if GetTickCount-IdleTime>120000 then
ShowMessage('闲置了2分钟');
end;

我把上边的程序最小化了五分钟一点反应都没有
 
procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
begin
IdleTime := GetTickCount;
end;
这里的问题吧。程序空闲的时候一直在记录的时间,这不是空闲开始的时间。
 
应该在程序开始忙的时候将IdleTime设置为0,在Application的OnIdle中判断只有IdleTime为0时,才记录时间IdleTime := GetTickCount。
 
function LastWork: DWord;
var
LInput: TLastInputInfo;
begin
LInput.cbSize := SizeOf(TLastInputInfo);
GetLastInputInfo(LInput);
Result := GetTickCount - LInput.dwTime;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
pass: dword;
begin
pass:=LastWork;
Label1.Caption := Format('系统已经闲置 %d 秒', [pass div 1000])
end;
 
TLastInputInfo,又学到了一个新的类型。不过这段程序得到的是Windows系统的空闲时间。
 
你程序的空闲时间与Windows系统的空闲时间有区别吗?
 
可以放個TIME,讓其一真運行,再設置個變量,從○開始加1,到某個值時開始鎖窗體,當鼠標 移動時,再從○開始計算。這樣就可以了,這是我的思想。可能太複雜化了,有更簡單的看樓下的了。。
 
当然有区别了。
 
To:kaida
当然有区别了,当程序最小化时,你做别的事情,那么程序是空闲的,而系统却是还在做别的事
 
多人接受答案了。
 
程序最小化=程序是空闲的?
有个Timer间隔毫秒就执行一次也叫空闲?

Application.OnIdle在程序执行完一段代码(处理完一个Message)时就触发一次

var
IdleTime: DWord = 0;

procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
begin
if IdleTime > 0 then
Caption := Format('程序已闲置 %d 毫秒', [GetTickCount - IdleTime]);
IdleTime := GetTickCount;
end;

这样就能看到效果了,要判断程序多久没接受输入就用kaida的
 
后退
顶部