Пресретање уноса тастатуре помоћу Делпхија

Размислите на тренутак о стварању неке брзе аркадне игре. Сва графика је, рецимо, приказана у ТПаинБок-у. ТПаинтБок не може примити фокус улаза - ниједан догађај се не активира када корисник притисне тастер; не можемо пресрести тастере за курсор да бисмо померили наш бојни брод. Делпхи помоћ!

Прекидач уноса тастатуре

Већина Делпхи апликација обично рукује корисницима путем одређених поступака за обраду догађаја, оних који нам омогућавају хватање корисника тастери и обради покрет миша.

Знамо да је фокус фокус на примање корисничког уноса путем миша или тастатуре. Само објект који има фокус може примити догађај на тастатури. Неке контроле, као што су ТИмаге, ТПаинтБок, ТПанел и ТЛабел не могу добити фокус. Примарна сврха већине графичких контрола је приказивање текста или графике.

Ако желимо пресрести унос тастатуре за контроле које не могу примити фокус улаза, мораћемо да се позабавимо Виндовс АПИ-ом, кукама, повратним позивима и поруке.

Куке за Виндовс

Технички гледано, функција "кука" је функција повратног позива која се може уметнути у Виндовс поруку систем тако да апликација може приступити току поруке пре него што се друга обрада поруке прими место. Међу многим врстама кука за Виндовс назива се кука на тастатури када год апликација позове ГетМессаге () или ПеекМессаге () функција и ту је ВМ_КЕИУП или ВМ_КЕИДОВН порука са тастатуре процес.

instagram viewer

Да бисмо створили куку тастатуре која пресреће сав унос тастатуре усмерен на дату нит, морамо да позовемо СетВиндовсХоокЕк АПИ функција. Програми који примају догађаје на тастатури су функције повратног позива које су дефинисане апликацијом, а које се називају функције кука (КеибоардХоокПроц). Виндовс позива вашу функцију кука за сваку поруку притиска на тастер (тастер за надоле и тастер доле) пре него што се порука постави у ред порука апликације. Функција куке може обрадити, променити или одбацити притиске тастера. Куке могу бити локалне или глобалне.

Тхе повратна вредност СетВиндовсХоокЕк је квака на управо инсталирану куку. Пре прекида, апликација мора назвати УнхоокВиндовсХоокЕк функција за ослобађање ресурса система повезаних са куком.

Пример куке на тастатури

Као демонстрација кукица на тастатури, направићемо пројекат са графичким управљањем који може примити притискање тастера. ТИмаге је изведен из ТГрапхицЦонтрол-а, може се користити као цртаћа површина за нашу хипотетичку борбену игру. Будући да ТИмаге не може примити притиске на тастатури кроз стандардне догађаје на тастатури, створићемо функцију кука која пресреће сав унос тастатуре усмерен на нашу површину цртања.

ТИмаге обрада догађаја на тастатури

Старт нев Делпхи Пројецт и ставите једну компоненту слике на образац. Поставите Имаге1.Алигн својство на алЦлиент. То је то због визуелног дела, сада морамо да урадимо неко кодирање. Прво, требаће нам неке глобалне променљиве:

 вар
Форм1: ТФорм1;
КБХоок: ХХоок; {овај пресретање уноса са тастатуре}
цк, ци: цели број; {положај борбеног брода}
{цаллбацк'с статемент}
функција КеибоардХоокПроц (Код: Интегер; ВордПарам: Ворд; ЛонгПарам: ЛонгИнт): ЛонгИнт; стдцалл;
имплементација
...

Да бисте инсталирали куку, зовемо СетВиндовсХоокЕк у ОнЦреате догађају обрасца.

 процедура ТФорм1.ФормЦреате (пошиљалац: ТОбјецт);
започети
{Подесите куку тастатуре тако да можемо пресрести унос тастатуре}
КБХоок: = СетВиндовсХоокЕк (ВХ_КЕИБОАРД,
{цаллбацк>} @КеибоардХоокПроц,
ХИнстанце,
ГетЦуррентТхреадИд ());
{поставите борбени брод на средину екрана}
цк: = Имаге1.ЦлиентВидтх див 2;
ци: = Имаге1.ЦлиентХеигхт див 2;
Имаге1.Цанвас. ПенПос: = Тачка (цк, ци);
крај;

Да бисмо ослободили системске ресурсе повезане са куком, морамо позвати функцију УнхоокВиндовсХоокЕк у догађају ОнДестрои:

 процедура ТФорм1.ФормДестрои (пошиљалац: ТОбјецт);
започети
{откачите пресретање тастатуре}
УнХоокВиндовсХоокЕк (КБХоок);
крај;

Најважнији део овог пројекта је Процедура повратног позива КеибоардХоокПроц користи се за обраду притиска тастера.

 функција КеибоардХоокПроц (Код: Интегер; ВордПарам: Ворд; ЛонгПарам: ЛонгИнт): ЛонгИнт;
започети
случај ВордПарам од
вк_Спаце: {избрисати пут борбеног брода}
започети
са Форм1.Имаге1.Цанвас до
започети
Четкица. Боја: = цлВхите;
Четкица. Стил: = бсСолид;
Испуните (Форм1.Имаге1.ЦлиентРецт);
крај;
крај;
вк_Ригхт: цк: = цк + 1;
вк_Лефт: цк: = цк-1;
вк_Уп: ци: = ци-1;
вк_Довн: ци: = ци + 1;
крај; {цасе}
Ако је цк <2, онда цк: = Форм1.Имаге1.ЦлиентВидтх-2;
Ако цк> Форм1.Имаге1.ЦлиентВидтх -2 тада цк: = 2;
Ако је ци <2 онда је ци: = Форм1.Имаге1.ЦлиентХеигхт -2;
Ако је ци> Форм1.Имаге1.ЦлиентХеигхт-2, онда ци: = 2;
са Форм1.Имаге1.Цанвас до
започети
Хемијска оловка. Боја: = цлРед;
Четкица. Боја: = цлИеллов;
ТектОут (0,0, Формат ('% д,% д', [цк, ци]));
Правокутник (цк-2, ци-2, цк + 2, ци + 2);
крај;
Резултат: = 0;
{Да бисте спречили да Виндовс пребаци притиске типке у циљни прозор, вриједност резултата мора бити једнака нули.}
крај;

То је то. Сада имамо крајњи код за обраду тастатуре.

Имајте на уму само једно: овај код ни на који начин није ограничен на употребу само са ТИмаге-ом.

Функција КеибоардХоокПроц служи као општи механизам КеиПревиев & КеиПроцесс.

instagram story viewer