Key press

1

Key press

offline
  • Pridružio: 13 Okt 2005
  • Poruke: 26

Koja procedura postoji u delphiju da oponasa pritiskanje dugmeta? Recimo hocu da se na svaku sekundu pritisne ctrl (a da nije zaglavljivanjem cackalice ),pretpostavljam da ce to ici u OnTimer event ali ne znam koja mi je proc potrebna?



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Emil Beli
  • Pridružio: 03 Jan 2005
  • Poruke: 2990
  • Gde živiš: Beograd

A zasto bi to tako radila. To je lose resenje, a i malo je komplikovano. Zar ti nije bolje da uradis jedan SendMessage na kontrolu koju zelis?



offline
  • Strog  Male
  • Stručni saradnik
    Web programiranje
  • Bojan Kopanja
  • Web & Mobile developer @ ZeusSoftware
  • Pridružio: 26 Jul 2003
  • Poruke: 2596
  • Gde živiš: Stara Pazova

Evo ti recimo ovako nekako:

procedure TForm1.Timer1Timer(Sender: TObject); var key: Char; begin   key:='c';   Form1.KeyPress(key); end;

E sad samo vidi koji je kod za ctrl i ovo moje kay:='c' zameni sa odgovarajucim kodom i resen problem Smile.

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Ako zelis da stvarno simuliras pritisak na neki taster onda ti ovi nacini koji su do sad predlozeni nece biti dovoljni. Recimo... ne mozes iz programa na ovaj nacin "pritisnuti CTRL + ALT + DEL" ili "WIN + E" ili neku slicnu kombinaciju. Ako je to ono sto ti treba koristi funkciju keybd_event. Nju koristi drajver tastature... a mozes i ti Wink

offline
  • Emil Beli
  • Pridružio: 03 Jan 2005
  • Poruke: 2990
  • Gde živiš: Beograd

@Strog
To reshenje ne valja. To je cist "botch" iliti zbrzavanje preko one stvari.

Srki je dao bolje resenje, ali i to nije najsrecnije.

@Beshtija
Pazi ovako. S obzirom da shvatam da tvoja aplikacija hvata event-e, s obzirom da hoces da pritisnes taster, pretpostavljam da nije konzolna.
Da bi uhvatila event, mora da je ili servis, ili aktivna.
Ako je aktivna, onda ima kontrolu koju treba "stisnuti" ili na bilo koji nacin "triggerovati" sa paramtrom "pritiska na CTRL".

Iz tog razloga ti kazem, najbolje, najpravilnije, a i najlakse resenje je proslediti poruku kontroli.

Za to se koristi SendMessage ili PostMessage API funkcija (SendMessage ako ti ne treba povratni rezultat). Ukljuci "windows" u USES, i pogledaj help za SendMessage.
Prvi parametar je HANDLE kontrole, onda ide MESSAGE (Win32Sdk.hlp), onda u wParam postavis code koji hoces, u ovom slucaju code tvog CTRL-a.

U delfiju takodje mozes da iskoristis komandu PERFORM.

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

@beli0135

Zasto mislis da bas njen program treba da "hvata" pritisak na taster? Smile
Tvoje resenje radi kada se zna koji prozor treba da primi poruku. Sta ako zeli da se CTRL pritiska stalno jer joj je u Windows-u XP ukljuceno da se na pritisak CTRL pojave oni krugovi oko kursora da bi se lakse uocio? Na koji handle treba da se posalje poruka? Smile

Ako neka od njenih kontrola treba da primi poruku da je taster pritisnut ne vidim zasto bi slala poruku!? Zar nije jednostavnoje da jednostavno sama pozove event? Smile

Dopuna: 18 Jan 2006 20:40

I da... pitanje je bilo
Citat:Koja procedura postoji u delphiju da oponasa pritiskanje dugmeta?
Bas to radi keybd_event... ta procedura se zapravo poziva i u drajveru tastature.

Da ne bude da pricam napamet... procitaj sam ovde.

offline
  • Emil Beli
  • Pridružio: 03 Jan 2005
  • Poruke: 2990
  • Gde živiš: Beograd

Nije rekla sta joj tacno treba... ali mi nije jasno kako to ne znas handle?! Pa imas FindWindow ako nije tvoja aplikacija, a ako jeste, onda znas handle.

offline
  • Pridružio: 13 Okt 2005
  • Poruke: 26

E evo ovako ako nije bilo jasno cemu sve to:
U jednoj igrici se puca pritiskom na CTRL(znaci ne drzanjem CTRL-a nego se stalno pritiska). I lepo umesto da ja sama stalno pritiskam CTRL bice pucanje stalno ukljuceno a ja samo pilotiram Smile
Zato mi zvuci da bi SendMessage posluzilo, ako kao handle dam tu igricu a poruka bi verovatno bila MK_CONTROL ako sam dobro shvatila?

Dopuna: 19 Jan 2006 13:31

Srki, nije mi jasno kako cu ja sa keybd_event bas odrediti da se taj signal pritiska dugmeta salje igrici? Recimo poziv bi ovako bio
keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0)
Za drugi parametar sam stavila da je nula posto neam blage veze sta on predstavlja Smile

offline
  • Emil Beli
  • Pridružio: 03 Jan 2005
  • Poruke: 2990
  • Gde živiš: Beograd

eee to je u pitanju...

1. napravi aplikaciju koja ce da pishe imena prozora u fajl, startuj igru, kreni malo da pucash i izadji
2. Kad nadjes ime prozora koje je za igricu (pazi, moze da se desi da glavni prozor igrice ne prihvata CTRL nego da tamo gde se puca ima drugi handle)

Sad znas ime prozora da napises program

1. Nadjes handle pomocu FindWindow
2. Posaljes poruku CTRL sa SendMessage na handle tog prozora

A moze i seljacka varijanta, (not recommended)
BroadcastMessage

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Kada pozoves keybd_event to je kao da si stvarno pritisnula neki taster. Pritisak tastera ce uhvatiti ona aplikacija koja bi ga uhvatila da stvarno pritisnes taster.

Ja ovo koristim za pucanje u SpaceInvaders2:
keybd_event(VK_RSHIFT, 0, 0, 0); keybd_event(VK_RSHIFT, 0, KEYEVENTF_KEYUP, 0);

Imam jednu petlju koji vrtim sve dok je SpaceInvaders pokrenut i ako je NUM Lock ukljucen, prvi igrac ima automatsko pucanje (kod koji vidis se poziva svaki put kada se prodje kroz petlju), a kada je SCROLL Lock ukljucen, drugi igrac ima automatsko pucanje (umesto VK_RSHIFT salje se VK_LSHIFT taster).

Ko je trenutno na forumu
 

Ukupno su 1004 korisnika na forumu :: 49 registrovanih, 4 sakrivenih i 951 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3028 - dana 22 Nov 2019 07:47

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 5.56, _commandos_, A.R.Chafee.Jr., awathorn, Bane san, bankulen, bojank2, caesar, celeron, cikadeda, darkangel, darkstar101, Deneb2, Duh sa sekirom, goranmd, goxin, hyla, kljift, Leonardo, ljuba sd, ljubo70, lojola, machak, mandicdamir245, Marko Marković, MB120mm, mgaji21, Milan A. Nikolic, moldway, Nebo_M, nuke92, oldtimer, powSrb, Profica, rkekoke, royst33, samsung2, shaja1, Sr.Stat., srbi, USSVoyager, Vienna, VJ, vlvl, voja64, yrraf, zajcev1, zola92, Živković