Bir uygulama çalıştırıyorum. Bu uygulamanın herhangi bir yerinde 5 dakikalık bir süre içinde herhangi bir işlem yapılmadıysa programın otomatik sonlandırılmasını istiyorum. Eğer bu zaman süresi içinde harhangi bir işlem yapıldıysa o zaman bu sürenin sıfırlanıp yeniden 5 dakikalık bir süre verdirmek istiyorum.
Bu işlemi nasıl yapabiliriz. Önerileriniz için şimdiden teşekkür ederim.
Süresi içinde hiç işlem yapılmayan programı sonlandırmak
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Süresi içinde hiç işlem yapılmayan programı sonlandırmak
Muttalip TOPTAŞ
Yıldız Teknik Üniversitesi
Bilgi İşlem Dairesi Başkanlığı
Tel: 0212-3832134
Yıldız Teknik Üniversitesi
Bilgi İşlem Dairesi Başkanlığı
Tel: 0212-3832134
Mouse ve Keyboard olaylarını takip etmen lazım, her hangi bir hareket oldugunda timer sıfırlanmalı,
yalnız yazdıgın program simge durumunda iken bu takibi yapamayacaksın,
o yuzden bu tarz bir uygulama icin genel keyboard ve mouse mesajlarını yakalaman gerekmekte
forumda hook diye arattıgın vakit bir kac baslık bulacaksın bu konu hakkında
yalnız yazdıgın program simge durumunda iken bu takibi yapamayacaksın,
o yuzden bu tarz bir uygulama icin genel keyboard ve mouse mesajlarını yakalaman gerekmekte
forumda hook diye arattıgın vakit bir kac baslık bulacaksın bu konu hakkında
ÜŞENME,ERTELEME,VAZGEÇME
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
S.A.
Öncelikle ve tahmin edebileceğin gibi formuna bir Timer koymalisin.
Bu 5 dk sonra formun başına gelecek akibeti gösterecektir.
Şimdi esas can alıcı nokta, tabi bu soruda ben kullanıcın form üzerinde mouse ya da klavye ile bir işlem yapmadığnı var sayıyorum. 5 dk. içinde kalvye ya da mouse işlemi olmaz ise Form kapanacak. Ya da program sonlanacak.
Öncelikle Mouse formun üstünde hareket ediyorsa, demek ki kullanıcı form ile ilgileniyor, ya da form üstünde bişiler okuyor diye düşünebilirsiz. Bu şekilde bir yaklaşım ile MOUSE, Formun üstünde hareket ettikçe Timer'ı sıfırlayabiliriz.
Bu kod sadece mouse'un form üstüdeki hareketini algılıyor. Bu yöntem sayesinde, çok şeyler yapılabilir, benim çok kullandığım bir şey ise, Formun Border'unu NONE yaptığımda üstteki bir resmi tıklarayak formu taşıtmaktadır. http://www.musonya.com/setup/JFs_Setup.exe bu adreste yazmış olduğum uygulamada bunu görebilirsiniz. Ayrıca bu ürünüde test etmiş olursunuz.
Yani formun herhangi bir yerinden değilde sadece belli bir yerindeyken mouse ile tutulursa taşıma yapmak istiyorsak şöyle tapabiliriz.
Bunu bilgi olsun diye veriyorum sizlere. Bu yukarıdaki kod, mouse formun belirtilen alanı içine girerse o alanı CAPTION bar gibi algılamasını sağlıyor. Ve mouse ile basılı tutup taşırsanız formunuzda taşınır.
Aslında teorik olarak mouse hareketi ile formun kullanılıp kullanılmadığını anlıyabiliriz. Fakat bu yetmez, ayrıca klavye tıklamalarınıda algılamak isteyebilirsiniz. Bu durumda;
Umarım faydalı olabilmişimdir.
Hepinize iyi çalışmalar dilerim.
Öncelikle ve tahmin edebileceğin gibi formuna bir Timer koymalisin.
Kod: Tümünü seç
procedure TForm1.Timer1Timer(Sender:TObject);
begin
Close;
end;
Şimdi esas can alıcı nokta, tabi bu soruda ben kullanıcın form üzerinde mouse ya da klavye ile bir işlem yapmadığnı var sayıyorum. 5 dk. içinde kalvye ya da mouse işlemi olmaz ise Form kapanacak. Ya da program sonlanacak.
Öncelikle Mouse formun üstünde hareket ediyorsa, demek ki kullanıcı form ile ilgileniyor, ya da form üstünde bişiler okuyor diye düşünebilirsiz. Bu şekilde bir yaklaşım ile MOUSE, Formun üstünde hareket ettikçe Timer'ı sıfırlayabiliriz.
Kod: Tümünü seç
type
TForm4 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Timer1 : TTimer;
procedure FormCreate(Sender: TObject);
.
.
.
private
procedure WMNCHitTest(var Msg: TMessage); message WM_NCHITTEST;
public
{ Public declarations }
end;
.
.
.
implementation
.
.
.
procedure TForm4.WMNCHitTest(var Msg: TMessage);
begin
inherited;
//Mouse form üstünde dolanıyor..
Timer1.Enabled := False;
Timer1.Enabled := True;
end;
.
.
.
Yani formun herhangi bir yerinden değilde sadece belli bir yerindeyken mouse ile tutulursa taşıma yapmak istiyorsak şöyle tapabiliriz.
Kod: Tümünü seç
procedure TForm4.WMNCHitTest(var Msg: TMessage);
var X, Y : Integer;
begin
inherited;
X := ScreenToClient(Mouse.CursorPos).X;
Y := ScreenToClient(Mouse.CursorPos).Y;
if (X > 0) And (X < Width) And
(Y > 0) And (Y < 100) Then Msg.Result := HTCAPTION;
end;
Aslında teorik olarak mouse hareketi ile formun kullanılıp kullanılmadığını anlıyabiliriz. Fakat bu yetmez, ayrıca klavye tıklamalarınıda algılamak isteyebilirsiniz. Bu durumda;
Kod: Tümünü seç
.
.
private
{ Private declarations }
procedure WMNCHitTest(var Msg: TMessage); message WM_NCHITTEST;
procedure DoAppMessage(var Msg: TMsg; var Handled: Boolean);
public
.
.
.
implementation
.
.
.
procedure TForm4.FormCreate(Sender: TObject);
begin
Application.OnMessage := DoAppMessage;
end;
.
.
.
procedure TForm4.DoAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
//Herhangi bir tuşa basılıp kaldırılınca
if Msg.message = WM_KEYUP then
begin
Timer1.Enabled := False;
Timer1.Enabled := True;
end;
//Fare'nin sol düğmesi kalkınca.. (tıklanınca)
if Msg.message = WM_LBUTTONUP then messagebeep(0);
end;
.
.
.
Hepinize iyi çalışmalar dilerim.
Re: Süresi içinde hiç işlem yapılmayan programı sonlandırmak
sayın murat dicle hocam yukarıdaki kodunuz ile ilgili şunu sormak istiyorum yardımcı olursanız sevinirim.
kullanıcı benim programım dışında herhangi bir yere double click yaptığında o pencerenin handle nosunu almak isitiyorum.vermiş olduğunuz şu kod ile bunu yapabilirmiyiim. kodu şu şöyle değiştirdim fakat hatlar aldım.
procedure TForm4.DoAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
//Fare'nin sol düğmesi kalkınca.. (tıklanınca)
if Msg.message = WM_LBUTTONUP then messagebeep(0);
end;
bu kodu timer1.timera ekledim.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
mouseMessage(WM_LBUTTONUP);
end;
şu hatayı aldım
Type of actual and formal var parameters must be identical
teşekkurler
kullanıcı benim programım dışında herhangi bir yere double click yaptığında o pencerenin handle nosunu almak isitiyorum.vermiş olduğunuz şu kod ile bunu yapabilirmiyiim. kodu şu şöyle değiştirdim fakat hatlar aldım.
procedure TForm4.DoAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
//Fare'nin sol düğmesi kalkınca.. (tıklanınca)
if Msg.message = WM_LBUTTONUP then messagebeep(0);
end;
bu kodu timer1.timera ekledim.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
mouseMessage(WM_LBUTTONUP);
end;
şu hatayı aldım
Type of actual and formal var parameters must be identical
teşekkurler