Herhangi bir tuş basılı mı değil mi ?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen anonymousdelphicoder »

Herkese merhabalar.

Sorunum şu klavyede o anda basılı tuş varmı yok mu bunu nasıl anlayabilirim ?
fakat dikkat etmenizi rica ettiğim bir nokta bir tuşun basılımı değilmi değil bunu GetAsyncState ile halledebiliyoruz.
örneğin ben fonksiyonu çalıştırdığımda klavyede eğer herhangi tuşa veya tuşlara basılıysam true veya false döndermesi lazım.

Bu konuda yardımlarınızı rica ediyorum.

Saygılar.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen xxxjedixxx »

Sanırım aşağıdaki kod işini görecektir.

Kod: Tümünü seç

var ShiftBasili, CtrlBasili, ATusuBasili: Boolean;
begin
  ShiftBasili := GetAsyncKeyState(VK_SHIFT) < 0;
  CtrlBasili := GetAsyncKeyState(VK_CONTROL) < 0;
  ATusuBasili := GetAsyncKeyState(Ord('A')) < 0;
  ...
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen anonymousdelphicoder »

cevabınız için teşekkür ederim fakat açıklamada yazdığım gibi ben bir tuşun basılı olup olmadığını değil klavyede herhangi bir tuş basılı mı değil mi bu tusun ne olduğu belli değil getasynckeystate komut ile zaten vermiş olduğunuz örneği halledebiliyorum benim istediğim klavyede o an herhangi bir tuş basılı mı yoksa değilmi yani klavye boşta mı değil mi
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen thelvaci »

Birkaç yol kullanabilirsiniz bunun için. İlk olarak; TApplication sınıfının OnMessage olay yöneticisinde; WM_KEYDOWN mesajı gördüğünüzde son zamanı GetTickCount ile alıp bir değişkende saklayıp; şu andaki GetTickCount ile arasındaki farkın belirli bir zamandan uzun olması durumunu kontrol edebilirsiniz.

Bir diğer yöntem ise; basılan her tuşun uygulamanın ana thread'inin mesaj kuyruğuna eklendiği gerçeğinden yola çıkarak, PeekMessage ile WM_KEY_FIRST, WM_KEY_LAST mesajlarının varlığını kontrol edebilirsiniz. GetMessage yerine PeekMessage komutunu PM_NOREMOVE ile çağırmaya dikkat edin ki, kuyruktaki tuş basımları henüz işlenmeden silmeyesiniz.
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen SimaWB »

anonymousdelphicoder yazdı:Sorunum şu klavyede o anda basılı tuş varmı yok mu bunu nasıl anlayabilirim ?
Aktif olan uygulama başka uygulama ise ve tuşa basılı ise? Bunun kontrolü de gerekiyorsa işler değişir...
There's no place like 127.0.0.1
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen anonymousdelphicoder »

yardımlarınız için sizlere teşekkür ederim. SimaWB bu sadece edit kontrolünün içinde geçerli olacak bunun dışında herhangi bir yer kapsamıcak. Tuğrul bey fikirleriniz için çok teşekkür ederim fakat tahminsel analiz pek sistemsel olmuyor 2. yolunuz makul fakat takıldığım bir kaç nokta var WM_KEYFIRST = WM_KEYDOWN sanırım buradak eşitligin sebebi bir tuşun ilk evresi keydown yani basılması gerekir buda WM_KEYFIRST olarak bizlere ikinci aynı değerli alias olarak tanımlanmış. Bir diğer nokta ise WM_KEYLAST klavyede parmağımızı çektiğimiz en son tuşu bildirmiyor sanırım. WndProcda denedim fakat olmadı Tuğrul Bey mümkünse PeekMessage veya WndProc la vaktiniz varsa soruda yazmış oldugumun örneğini yazabilir misiniz ? birde Triger yani event mantıgında yapmak istedigim için peeki while a almam gerek klavye bosta veya dolu oldugunda eventi tetiklemem gerek. while durumunda ana threadi sürekli meşgul etmiş ve diğer işlemlere cevap veremez olmazmı blokladığı için ?

teşekkürler.
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen anonymousdelphicoder »

procedure TForm2.Button2Click(Sender: TObject);
var
tmsg:tagMSG;
begin
while true do begin

while PeekMessage(tmsg,edt1.handle,WM_KEYFIRST,WM_KEYLAST,PM_NOREMOVE) do begin
if tmsg.message = WM_KEYLAST then
Form2.mmo1.Lines.Add('TUŞ YOK');
Application.ProcessMessages;
end;
Application.ProcessMessages;
end;
end;

Herhangi bir işe yaramadı malesef.
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen anonymousdelphicoder »

thelvaci yazdı:Birkaç yol kullanabilirsiniz bunun için. İlk olarak; TApplication sınıfının OnMessage olay yöneticisinde; WM_KEYDOWN mesajı gördüğünüzde son zamanı GetTickCount ile alıp bir değişkende saklayıp; şu andaki GetTickCount ile arasındaki farkın belirli bir zamandan uzun olması durumunu kontrol edebilirsiniz.
Tuğrul bey editin wndproc unda keydown ve keyup mesajları şart olarak tanımlı şimdi şöyle düşünelim. klavyede parmağınızla A tuşuna basılı tuttukça WM_KEYDOWN mesajı gelir. Bu durumda
Ctrl shift ve space nin basılı oldugunu varsayalım son dan basa doğru parmağımızı çektigimizde her çekişte basılı olan tuslar için zaten keydown mesajı gelecektir GETTICKCOUNT ile değişkene set ettiğimizi düşünelim ve her KEYUP da tus basılımı diye kontrol ettiğimizde GETTICKCOUNT ile atadığımız değer arasında belki 1 2 belki 3 4 ms fark olacak. Bu durumu tus basılı olarak düşünelim son tusa geldim halen Ctrl e basıyorum bu süreçt değişkenimdeki gettickcount da yenileniyor parmağımı çektiğim gibi keyup fırladı ve aradaki fark bir önceki gettickcount farkıyla eşdeğer olacak (yakinen) bu durumda sanırım bu yol olmaz.

Yanlışım varsa düzeltin lütfen.

teşekkürler.
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen anonymousdelphicoder »

fikirlerinizi bekliyorum hocam.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen thelvaci »

Merhaba, farklı noktalara dallanmanıza vesile olmadan önce; ne yapmak istediğinizi ve bunu neden istediğinizi daha iyi anlamalıyız. Bu sayede farklı öneriler ile de karşılaşabilirsiniz. Örneğin, klavye'ye kanca(hook) atabilir yada MsgWaitForMultipleObjects ile QS_KEY bekleyebilirsiniz vs. Ama, ben tam olarak ne yapmak istediğinizi anlayamadım. Konu başlığında herhangi bir tuş basılı mı değil mi diye sorduğunuz için size en basit iki öneriyi sunmuştum, siz daha farklı bir şey mi yapmaya çalışıyorsunuz ?
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen anonymousdelphicoder »

Teşekkür ederim. Kanca olayı malesef çoğu Antivirüs den geçemiyor ayrıca kanca atarak low level tuşların gitmesi gereken yere gitmeden yakalamamıza olanak sağlar fakat basıpda çekilen tusun son tus oldugunu anlamak için nasıl kullanabileceğimizi bakımından kendimce bi anlam çıkaramadım. diğer waitmultipleobjects qs_key hakkında bilgim hiç yok.

Amaç şu bir edit sınıfım var tcustomedit bunun wndproc olayı var burada aşağıdaki olay var.

if (Msg.Msg = WM_KEYDOWN) or (Msg.Msg = WM_SYSKEYDOWN) then begin

//Burada tuşlar basıldığını anlıyoruz

end else if (Msg.Msg = WM_KEYUP) or (Msg.Msg = WM_SYSKEYUP) then begin {KEY UP}

//burada ise basılan tuşun keyup çekildiğini anlıyoruz.

istediğim ise burada basılıp da keyup olan tuşun klavyede basılıpda çekilen son tuş oldugunu anlamak istiyorum
örneğin ctrl + shift + c bastık parmak sırası hiç farketmez elimi klavyeden kaldırdığımda keyup olayında artık basılı bir tusun olmadıgını anlamak istiyorum.
amacım bir windows destekli hotkey yapmak ki başarıya ulastım fakat algoritmama göre bu basılı olup olmama olayını anlamam lazım.


end;

teşekkürler.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen thelvaci »

Amacınızın hotkey yapmak olduğunu baştan anlayabilmiş olsa idim; size RegisterHotKey , UnRegisterHotKey & WM_HOTKEY üçlüsünü önerirdim. Bu kadar uğraşmanıza da gerek kalmazdı. Ancak izlediğiniz yolda gitmek isterseniz eğer; ilgili Edit sınıfı için hotkey tuşlarını bir şekilde belirtiyor olmalısınız. Örneğinizde, Keyup kısmında GetKeyboardState API'sinden istifade edebilirsiniz bu durumda ilgili tuşların durumunu öğrenmek için. Ancak maksat hotkey yapmak ise dediğim gibi RegisterHotKey API'si işinize fazlası ile yarayacaktır.
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen anonymousdelphicoder »

sanırım sorunu tam izah edemedim ben bir tuşuy register etmekden bahsetmedim bildiğiniz gibi editbox kullandım ve burada tuslara basarak ctrl + shift + x gibi kombinasyonları yazdırmakla kalmayıp delphideki hotkey nesnesinin desteklemediği win + x win + printscreen vss multimedia tusları desteklemedigi için ben kendim yazdım eğer bu dediğim özelliklerde bileşen varsa söyleyin kullanayım.
yoksa sorunum hakkında yardımcı olabilirseniz çok sevinirim verdiğiniz

vResult := MsgWaitForMultipleObjects(0, nil^, True,INFINITE, QS_KEY);
if vResult = WAIT_OBJECT_0 then begin
ShowMessage('tuş yok');
end;
örneği denedim fakat olumlu olamadı örneğin A tusuna basılı tuttugumda edite yazıyor fakat elimi çektiğimde epey süre bekleyip sonra set oluyor ve ctrl + alt kombinasyonlarnda doğru sekilde set olmuyor.
Aslında çözümü buldum sanırım editin mesaj kuyrugunda WM_KEYDOWN,WM_SYSKEYDOWN,WM_KEYUP,WM_SYSKEYUP olmadığını nasıl anlayacagimi bilsem sanırım bu sekilde çözülebilir.
Elimden geldiğince araştırıp uyguluyorum fakat çözüme ulasamıyorum yani denemeden veya çabalamadan size dönüş yapıyorum fakat durum hep FALSE...
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen anonymousdelphicoder »

Ayrıca GetKeyboardState ile yapmak aklıma gelmedi değil fakat altını çizerek söylüyorum GetKeyboardState ile tkeyboardstate ye aldığım zaman klavyeden hiç bir tusa basmamama ragmen default 1 (bir) olarak yazılı 15 tane index geliyor (az önce saydım) bu default 1 gelen indexler hakkında bilgi verirseniz. işim kolaylasabilir çünkü her Windows işletim sisteminde bu sabit 1 ler aynı index ve aynı sayıda mı geliyor veyabunların yerleri değişiyormu çünkü bu tkeyboardstate yi döngüye aldıgımda 1 eğer 1 varsa basılı tus demek olacak benim için bu durumda stabil default 1 gelmiyorsa büyük sıkıntı ?
anonymousdelphicoder
Üye
Mesajlar: 152
Kayıt: 16 May 2014 11:23

Re: Herhangi bir tuş basılı mı değil mi ?

Mesaj gönderen anonymousdelphicoder »

Ayrıca ÖNEMLİ bir not eklemek istiyorum CAPSLOCK NUMLOCK SCROLLOCK tusları sistemde aktif olması halinde GetKeyboardState ile gelen değişkende 1 gelecek oysa ben o an capslocka basmadım ama önceden aktif oldugu için 1 gelecek buda hala basılı tuş varmıs gibi gözükecek....

Hocam bunun sağlam bir yolu yokmudur.. :)
Cevapla