Herhangi bir tuş basılı mı değil mi ?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 152
- Kayıt: 16 May 2014 11:23
Herhangi bir tuş basılı mı değil mi ?
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.
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.
-
- Üye
- Mesajlar: 216
- Kayıt: 10 Ara 2013 03:50
Re: Herhangi bir tuş basılı mı değil mi ?
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;
...
-
- Üye
- Mesajlar: 152
- Kayıt: 16 May 2014 11:23
Re: Herhangi bir tuş basılı mı değil mi ?
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
Re: Herhangi bir tuş basılı mı değil mi ?
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.
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.
Re: Herhangi bir tuş basılı mı değil mi ?
Aktif olan uygulama başka uygulama ise ve tuşa basılı ise? Bunun kontrolü de gerekiyorsa işler değişir...anonymousdelphicoder yazdı:Sorunum şu klavyede o anda basılı tuş varmı yok mu bunu nasıl anlayabilirim ?
There's no place like 127.0.0.1
-
- Üye
- Mesajlar: 152
- Kayıt: 16 May 2014 11:23
Re: Herhangi bir tuş basılı mı değil mi ?
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.
teşekkürler.
-
- Üye
- Mesajlar: 152
- Kayıt: 16 May 2014 11:23
Re: Herhangi bir tuş basılı mı değil mi ?
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.
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.
-
- Üye
- Mesajlar: 152
- Kayıt: 16 May 2014 11:23
Re: Herhangi bir tuş basılı mı değil mi ?
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 durumdathelvaci 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.
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.
-
- Üye
- Mesajlar: 152
- Kayıt: 16 May 2014 11:23
Re: Herhangi bir tuş basılı mı değil mi ?
fikirlerinizi bekliyorum hocam.
Re: Herhangi bir tuş basılı mı değil mi ?
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 ?
-
- Üye
- Mesajlar: 152
- Kayıt: 16 May 2014 11:23
Re: Herhangi bir tuş basılı mı değil mi ?
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.
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.
Re: Herhangi bir tuş basılı mı değil mi ?
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.
-
- Üye
- Mesajlar: 152
- Kayıt: 16 May 2014 11:23
Re: Herhangi bir tuş basılı mı değil mi ?
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...
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...
-
- Üye
- Mesajlar: 152
- Kayıt: 16 May 2014 11:23
Re: Herhangi bir tuş basılı mı değil mi ?
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ı ?
-
- Üye
- Mesajlar: 152
- Kayıt: 16 May 2014 11:23
Re: Herhangi bir tuş basılı mı değil mi ?
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..
Hocam bunun sağlam bir yolu yokmudur..
