المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : كيف اعرف ان المستخدم توقف عن العمل داخل البرنامج ؟


abdelmalek
08-08-2010, 09:43 AM
السلام عليكم ورحمة الله وبركاته

حياكم الله يااحبائنا الكرام

كيف لي ان اعرف ان المستخدم توقف عن العمل داخل البرنامج ؟
نضرب مثال من الواقع :
عندما يتوقف المستخدم عن العمل على الجهاز مدة 5 دقائق مثلا يقوم الوندوز بتشغيل شاشة التوقف .
في امان الله

kachwahed
08-08-2010, 12:48 PM
وعليكم السلام ورحمة الله وبركاته
كيف لي ان اعرف ان المستخدم توقف عن العمل داخل البرنامج ؟
العمل داخل البرنامج يعني: تحريك مؤشر الماوس أو العبث بلوح المفاتيح
غير ذلك المستخدم لا يستعمل البرنامج
لالتقاط حدث تحريك الماوس -> OnMouseMove
لالتقاط حدث ضغط المفاتيح -> OnKeyDown
مثال:
يمكن استخدام TTimer يتم تعطيله عند أحد الحدثين السابقين
يمكن جعل هذا الأخير يقوم بتفعيل TTimer آخر يقوم بأي مهمة
ضع Timer1, Timer2 ثم اضبط Interval للـ Timer1 على المدة التي تريد:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Timer1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
SendMessage(Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
Timer1.Enabled := True;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
FormMouseMove(Sender, [], 0, 0)
end;
بالتوفيق :)

TF6M
08-08-2010, 01:13 PM
و عليكم السلام و رحمة الله و بركاته

1- كيف لي ان اعرف ان المستخدم توقف عن العمل داخل البرنامج ؟
- ببساطة نراقب الـ CurrentThread , أو الثريد الحالي و هو للبروسس الشغال أو الـ Active
- لجلب Id للثريد الحالي , GetCurrentThreadId أو System.MainThreadID
Caption:= ConCat('SystemThr :' , IntToStr(System.MainThreadID)
, ' Or SystemThr :' + IntToStr(GetCurrentThreadId()));procedure TForm1.tmr1Timer(Sender: TObject);
begin
Label1.Caption:= Format('%d',[
GetWindowThreadProcessId(
GetForegroundWindow ,nil)
And $FFFF]);
end;2- عندما يتوقف المستخدم عن العمل على الجهاز مدة 5 دقائق مثلا يقوم الوندوز بتشغيل شاشة التوقف ?
- يمكن عمل Timer أو Thread أو Object , لتحرير شاشة التوقف !
SendMessage(Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 1);- راجع WM_SYSCOMMAND , بالإظافة إلى خيارات أخرى SC_MONITORPOWER :laugh: .
بالتوفيق,,

abdelmalek
08-08-2010, 04:09 PM
بارك الله فيكم وزادكم علما

بالتوفيق للجميع

shagrouni
08-08-2010, 04:33 PM
السلام عليكم

هذا مثال وجدته في delphi.about.com
http://delphi.about.com/od/adptips2004/a/bltip1104_4.htm

باستخدام GetLastInputInfo

function SecondsIdle: DWord;
var
liInfo: TLastInputInfo;
begin
liInfo.cbSize := SizeOf(TLastInputInfo) ;
GetLastInputInfo(liInfo) ;
Result := (GetTickCount - liInfo.dwTime) DIV 1000;
end;

procedure TForm1.Timer1Timer(Sender: TObject) ;
begin
Caption := Format('System IDLE last %d seconds', [SecondsIdle]) ;
end;

abdelmalek
08-08-2010, 05:11 PM
وعليكم السلام

بارك الله فيك استادنا الغالي shagrouni

روعة ممتاز جدا

في امان الله