Tüm Formlarda Tuşları Okumak

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
emrahgs
Üye
Mesajlar: 109
Kayıt: 08 Tem 2008 05:25
Konum: Antalya

Tüm Formlarda Tuşları Okumak

Mesaj gönderen emrahgs » 04 Eki 2010 02:05

Arkadaşlar
Projedeki tüm formlarda basılan tuşları okuyabildiğimiz bir yer var mı?
yani formun onkeypress i gibi olacak ama tüm projeyi kapsayacak

Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 30 Eyl 2007 11:02
Konum: Ankara

Re: Tüm Formlarda Tuşları Okumak

Mesaj gönderen Battosai » 04 Eki 2010 03:16

Keyboard Hook yapabilirsiniz ama keyboard hook win7 de bazı sıkıntılara yol açabilir...veya bir procedure yazarak bütün formların onkeypress olayına atama yapabilirsiniz. Formları lazım olduğunda çağırdığınızı varsayarsak form oluşturma kodunda bu atama yapılabilir zahmetsiz olur.

RamazanG
Üye
Mesajlar: 73
Kayıt: 16 Tem 2010 02:38

Re: Tüm Formlarda Tuşları Okumak

Mesaj gönderen RamazanG » 04 Eki 2010 09:14

Komponentin Adını Algılamak

Bu uygulama farenin tıkladığı komponentin adını döndürür FindControlAtPos uygulamasını global olarak tanımlarsanız diğer komponentler içinde kullanabilirsiniz.

Kod: Tümünü seç

function FindControlAtPos: TWinControl;
var
  Pt: TPoint;
begin
  GetCursorPos(Pt);
  Result := FindControl(WindowFromPoint(Pt));
end; 
Komponentin OnMouseUp olayına yazın.

Kod: Tümünü seç

procedure TForm1.GenericMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  TWC: TWinControl;
begin
  TWC := FindControlAtPos;
  {hangi sınıf içindeyiz}
  Showmessage('Buradayız: ' + TWC.ClassName);
  {Boşluk}
  TWC.Visible := False;
  Sleep(150);
  TWC.Visible := True;
end;

emrahgs
Üye
Mesajlar: 109
Kayıt: 08 Tem 2008 05:25
Konum: Antalya

Re: Tüm Formlarda Tuşları Okumak

Mesaj gönderen emrahgs » 05 Eki 2010 02:27

Battosai
Evet aslında tüm formların onkeypress olayına atama yapılabilir ama bennim projemde 100 lerce form var ve bunları bazılarında onkeypress çalışıyor.
RamazanG
Dostum benim istediğim tam olarak o değil yada ben senin yazdığın tam anlayamadım

Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 30 Eyl 2007 11:02
Konum: Ankara

Re: Tüm Formlarda Tuşları Okumak

Mesaj gönderen Battosai » 05 Eki 2010 05:42

Ana forma bir adet TApplicationEvent bileşeni atınız. OnMessage olayına aşağıdaki örnek kodu uygulayın kendi sisteminize uyarlayın. Projenizdeki tüm keydown olayları için işlem tetiklenecektir.

Kod: Tümünü seç

procedure Tform1.AppEvent1Message(var Msg: tagMSG; var Handled: Boolean);
function GetChar(Key: Word): string;
 var
    keyboardState: TKeyboardState;
    asciiResult: Integer;
 begin
    GetKeyboardState(keyboardState) ;
    SetLength(Result, 2) ;
    asciiResult := ToAscii(key, MapVirtualKey(key, 0), keyboardState, @Result[1], 0) ;
    case asciiResult of
      0: Result := '';
      1: SetLength(Result, 1) ;
      else
        Result := '';
    end;
 end;
begin
if Msg.message=WM_KEYDOWN then
    memo1.Lines.Add(GetChar(Msg.wParam));
end;
örnekte basılan tuşları memoya ekliyor...

emrahgs
Üye
Mesajlar: 109
Kayıt: 08 Tem 2008 05:25
Konum: Antalya

Re: Tüm Formlarda Tuşları Okumak

Mesaj gönderen emrahgs » 06 Eki 2010 02:14

Dostum Sağ olasın tam olarak istediğim buydu
birde (Ctrl) - (Alt) -(ALt+A) - .. gibi tuşları eklemek istedim ama yapamadım bu konuda yardımcı olabilir misin ?

Aslında Klavyeden girilen tüm her şeyi kaydedip sonra istenildiği zaman kayıtlı tuşları oynatmak istiyorum
tabi burda Alt+E,Ctrl+K... gibi aynı anda basılan tuşlarıda bu şekilde göndermem gerekiyor

Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3040
Kayıt: 17 Nis 2006 07:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Tüm Formlarda Tuşları Okumak

Mesaj gönderen sabanakman » 09 Eki 2010 10:52

Ctrl, Shift ve Alt gibi çoklu tuş kombinasyonları da kullansanız sonuçta bunların herr biri ayrı bir mesaj olarak gidecektir. Yapmanız gereken giden mesaja göre değerleri ayarlayıp çalıştırmak olacaktır.

Kod: Tümünü seç

var
 tCtrl,tShift,tAlt:Boolean;

const
  VK_K=Ord('K');
  VK_A=Ord('A');

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
  if Msg.message=WM_KEYDOWN then begin //--->
    case Msg.wParam of
      VK_CONTROL:tCtrl:=True;
      VK_SHIFT:tShift:=True;
      VK_MENU:tAlt:=True;
    end;
  end;
  if Msg.message=WM_KEYUP then begin //--->
    case Msg.wParam of
      VK_CONTROL:tCtrl:=False;
      VK_SHIFT:tShift:=False;
      VK_MENU:tAlt:=False;
    end;

    if (Msg.wParam=VK_A) and tCtrl and tAlt then
     ListBox1.Items.Add('Ctrl+Alt+A');

    if (Msg.wParam=VK_K) and tCtrl then
     ListBox1.Items.Add('Ctrl+K');
  end;
end;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .

Cevapla