Mouse olayı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
ademiz
Üye
Mesajlar: 151
Kayıt: 30 Tem 2003 02:41
Konum: İstanbul
İletişim:

Mouse olayı

Mesaj gönderen ademiz »

Arkadaşlar basit olabilir ama şu an keşfedemedim.

Formun üzerinden Mouse ayrılınca Formu kapatmak istiyorum

şimdiden teşekkürler
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...

- Aslında basit değil... Windows Message Hook olayına başvurmak lazım...

viewtopic.php?t=2104&highlight=#10317

- Basit düşünürsek, formun OnMouseMove olayına

Kod: Tümünü seç

  If ( X < 1 ) OR ( X > Form1.Width-1) OR
     ( Y < 1 ) OR ( Y > Form1.Height-1) then Close;
kodunu yazmak kafi gibi görünüyor ama kazın ayağı öyle olmuyor... :o

- Mouse'un hızlı hareketlerini takip edemez... :idea:

- Sizin System Wide Windows Message Hook olayı ile mouse koordinatlarını, mouse formunuzun dışında olsa dahi okumasını sağlamalı; mouse işaretçisinin windows desktop üzerindeki koordinatının formunuzun desktop üzerindeki koordinatları dışında olduğunu gördüğünüzde formu kapatmasını ve ek olarak da form kapalıysa formu tekrar kapatmaya çalışmamasını sağlamanız gerekiyor... :idea:
Resim
Resim ....Resim
P206
Kıdemli Üye
Mesajlar: 395
Kayıt: 17 Haz 2003 12:36
Konum: İstanbul

Mesaj gönderen P206 »

Merhaba,
Eğer Bunu timer ile yapmak istersen bu şekilde bir kodla yapabilirsin.

var
pos:Tpoint;
begin
GetCursorPos(pos);
if (pos.x>(left+Width)+1) or (pos.x<left-1) then close;
if (pos.y<top) or (pos.y>top+Height+1) then close
end;
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Windows MouseLeave mesajını yakalayarak ta yapabilirsin.

Kod: Tümünü seç

procedure CMMouseLeave( var Msg: TMessage ); message cm_MouseLeave; 

....


procedure TForm1.CMMouseLeave(var Msg: TMessage);
begin
//yapmak istediğin işle ilgili kod
end;
Kolay gelsin.
Kullanıcı avatarı
ademiz
Üye
Mesajlar: 151
Kayıt: 30 Tem 2003 02:41
Konum: İstanbul
İletişim:

Mesaj gönderen ademiz »

Sağolun Arkadaşlar
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...

- Merakımı yenemeyip yukarda anlatılanları denedim... :oops:

- Google'da aradım. Bulduklarım içerisinde beğendiğim ve de alternatif sayılabilecek bir üçüncü yöntem sunayım...

- CTRL+SHIFT+C ile yapılan otomatik ekleme Override eklenmiyor... onun için Private kısmına...

Kod: Tümünü seç

procedure TForm1.DefaultHandler(var Message); Override;
eklenecek... :idea:

Kod: Tümünü seç

var
  lpEventTrack: TTrackMouseEvent;
  MouseEnter: boolean;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with lpEventTrack do
  begin
    cbSize := SizeOf(TTrackMouseEvent);
    dwFlags := TME_HOVER or TME_LEAVE;
    hwndTrack := Handle;
    dwHoverTime := HOVER_DEFAULT;
  end;
  TrackMouseEvent(lpEventTrack);
end;

procedure TForm1.DefaultHandler(var Message);
begin
  case TMessage(Message).Msg of
    WM_MOUSELEAVE:
    begin
      Caption := 'Exit';
      MouseEnter := false;
    end;
  else
    inherited;
  end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if not MouseEnter then
  begin
    Caption := 'Enter';
    MouseEnter := true;
    lpEventTrack.dwFlags := TME_LEAVE;
    TrackMouseEvent(lpEventTrack);
  end;
end;

Resim
Resim ....Resim
Cevapla