cs_Forman
Messages postés
600
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
6 avril 2010
1
28 mai 2006 à 19:18
>marignan1515: Non ce n'est pas possible de déterminer depuis combien de temps un processus est inactif (du moins pas de façon vraiment déterministe). On pourrait essayer de calculer le pourcentage de ressource processeur qu'il utilise mais ce n'est pas très fiable, et de plus un programme "inactif" en apparence peut quand même consommer de la ressource...
Mais j'ai peut-être une solution à ton problème. Si j'ai bien suivi, il te suffit de savoir si ce qui est affiché à l'écran n'a pas bougé depuis 5 secondes? Voilà une fonction qui te permettra de savoir depuis combien de temps ce qui n'est pas affiché à l'écran n'a pas changé:
function MonitorScreen(TimeOut:Cardinal):Boolean;
var
DC:HDC;
Bitmap:TBitmap;
Buffer1,Buffer2:Pointer;
TickStart,TickEnd:Cardinal;
BuffSize:Integer;
BI:TBitmapInfo;
begin
DC:=GetDC(GetDesktopWindow);
Bitmap:=TBitmap.Create;
Bitmap.Width:=400;
Bitmap.Height:=400;
BuffSize:=Align32(24*Bitmap.Width)*Bitmap.Height;
GetMem(Buffer1,BuffSize);
ZeroMemory(Buffer1,BuffSize);
GetMem(Buffer2,BuffSize);
ZeroMemory(Buffer2,BuffSize);
Sleep(500);
try
ZeroMemory(@BI,SizeOf(BI));
with BI.bmiHeader do begin
biSize:=SizeOf(TBitmapInfoHeader);
biWidth:=Bitmap.Width;
biHeight:=Bitmap.Height;
biPlanes:=1;
biBitCount:=24;
biCompression:=BI_RGB;
biSizeImage:=BuffSize;
end;
StretchBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,DC,0,0,Screen.Width,Screen.Height,SRCCOPY);
if GetDIBits(Bitmap.Canvas.Handle,Bitmap.Handle,0,Bitmap.Height,Buffer1,BI,DIB_RGB_COLORS)=0 then
RaiseLastOSError;
TickStart:=GetTickCount;
repeat
Sleep(500);
StretchBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,DC,0,0,Screen.Width,Screen.Height,SRCCOPY);
if GetDIBits(Bitmap.Canvas.Handle,Bitmap.Handle,0,Bitmap.Height,Buffer2,BI,DIB_RGB_COLORS)=0 then
RaiseLastOSError;
TickEnd:=GetTickCount;
until (TickEnd-TickStart>TimeOut) or not CompareMem(Buffer1,Buffer2,BuffSize);
Result:=TickEnd-TickStart<=TimeOut;
finally
FreeMem(Buffer1);
FreeMem(Buffer2);
ReleaseDC(GetDesktopWindow,DC);
Bitmap.Destroy;
end;
end;
Si tu appelles la fonction ainsi (le paramètre TimeOut s'exprime en millisecondes):
MonitorScreen(10000)
2 possibilités:
1/si le contenu de l'écran n'a pas changé au bout de 10 secondes, la fonction s'arrète et renvoie False
2/si le contenu de l'écran change avant que 10 secondes ne se soient écoulées, cette fonction s'arrète à la première modification détectée et renvoie True.
Ainsi, en appelant Monitor(6000) par exemple, tu sauras si ton programme est resté inactif plus de 6000 millisecondes (donc 6 secondes>5 secondes). A noter que pour être compilée, la fonction nécessite les unités Graphics et Windows dans la clause uses de ton unité (elles sont déjà mises par défaut par Delphi pour les fiches).
La fonction est précis à une demi-seconde près environ (à cause du Sleep(500)) si tu veux que ce soit un peu plus précis tu peux diminuer 500 et mettre une valeur en millisecondes plus petite, mais cette fonction consommera plus de ressources processeur.
Voilà, j'espère avoir résolu ton problème