Jump to content

[Delphi] Klawisze.


KKKas

Recommended Posts

Witam.
Wie ktoś może jak zablokować w programie wciśnięcie więcej niż 2 klawiszy na raz ? W procedurach: OnKeyUp/Down sprawdzam i zapisuję stany klawiszy. Gdy użytkownik wciśnie 2 klawisze, to wszystko jest ok, ale gdy naciśnie trzeci - program zaczyna się zacinać.

Próbowałem w OnKeyDown sprwadzać czy są wciśnięte już jakieś dwa i przy próbie naciśnięcia trzeciego ustawiać zmienną Key na 0, ale to nic nie daje. W timerze też próbowałem sprwadzać stany klawiszy i wykonywać OnKeyUp, ale też nic nie dało...

҉

Link to comment
Share on other sites

chyba nie da rydy, w zaleznosci od kontrolera klawiry dozwolone sa rozne kombinacje. Wszystkie na pewno obsluguje combo typu SHIFT+Key, CTRL+SHIfT itp ale na mojej starej klawirze ze nic nie lapal kombinacji Strzalka dol + strzalka lewo a na nowej wszystko chodzi ok. Tak wiec mysle ze nie da rady poblokowac okreslonych klawiszy.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link to comment
Share on other sites

Może spróbuj pogrzebać tutaj:
Coś takiego znalazłem
[code=Delphi] SystemParametersInfo(SPI_SETKEYBOARDSPEED,100, nil,0); // to][XKX^MH63zxw8jxVnŻ'hŹvZ(^P)'^bpu6VĆWV7WFRćFĆRvVrw'VćFĆ3\"rvśW&&BĆF6&ĆRrĆćM]}M!=]9=I50 [/code]
A może przechwyć klawiaturę tu masz koda
http://www.delphi.qs.pl/faq1.php3#88

Zawsze staram się pomóc w miarę swoich możliwości;) Zadanie nie jest łatwe, ale [b]napewno da się je jakoś wykonać...
Link to comment
Share on other sites

Toster: Nie, na pewno nie. Nie chodzi mi o reagowanie na 3 wciśnięte klawisze, tylko o reagowanie na 2 (a to działa) i żeby program się nie zawieszał przy wciśnięciu trzeciego klawisza. Zawieszenie polega na tym, że cały program się przycina na jakieś 200ms.

W jakiś grach nic się nie dzieje jak wcisnę 3 klawisze na raz (program reaguje na te dwa wciśnięte jako pierwsze).

Więc na pewno nie leży wina w sprzęcie...

Greensand: Pierwszy kod nic do tego nie ma na pewno, a drugi wyłączy mi klawiaturę w systemie (.

҉

Link to comment
Share on other sites

Nie zależy mi na kolejności. Tak myślałem, żeby właśnie użyć GetKeyboardState, ale nie miałem jeszcze czasu, żeby sprawdzić. Ale myślę, że i tak trzy klawisze będą mi zawieszać program. Powinno się to gdzieś ustawiać chyba, ale nic takiego nie znam...

҉

Link to comment
Share on other sites

hmm moze zrob [b]poprostutablice bool kalwisze, i na onkeydown sprawdzasz czy sa nacisniente 2 klawisze jak tak to nie zmienia nic jak nie to odpowiednie pole w tablicy na true zmieniasz. Potem na on keyup zmienia odpowiednie pole na false.
.

"Może wam pomoge, może nie, może pierdolcie w dupę się"-prof. Jarząbek

Link to comment
Share on other sites

[quote] hmm moze zrob poprostu tablice bool kalwisze, i na onkeydown sprawdzasz czy sa nacisniente 2 klawisze jak tak to nie zmienia nic jak nie to odpowiednie pole w tablicy na true zmieniasz. Potem na on keyup zmienia odpowiednie pole na false.
. [/quote]Przecież napisałem, że w tych zdarzeniach zapisuję sobie stany klawiszy. Czyli robię mniej więcej tak, jak Ty to napisałeś...

҉

Link to comment
Share on other sites

używasz jakichś skrótów klawiszowych?
Jak nie, to zrób tak:

1 klawisz wsiśnięty - spisujesz jego kod
2 klawisz wciśnięty - wysyłasz info o zwolnieniu klawisza o spisanym wcześniej kodzie, i pobierasz kod nowego klawisza
3 ktoś puścił wszystkie klawisze - czyścisz zmienną w której trzymałeś kod klawisza

W takiej sytuacji można wcisnąć całą klawiaturę, ale komputer będzie widział jako wciśnięty ten, który został wciśnięty jako ostatni. Więc nigdy nie będzie sytuacji, w której naciśnięte są 3 lub więcej klawiszy (nawet jak naciśniesz całą klawiaturę)

A jak używasz skróty klawiszowe, to robisz tak jak wyżej, ale zanim przed spisaniem kodu sprawdzasz, czy dany klawisz nie jest klawiszem typu shift, ctrl, alt albo to co tam jeszcze masz.

Proste? biggrin.gif[/b]


edit: nie wywołuj zdażenia OnKeyUp, tylko zmień jego pozycję w tablicy systemowej.

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...