Подумайте на минуту о создании быстрой аркадной игры. Вся графика отображается, скажем, в TPainBox. TPaintBox не может получить фокус ввода - никакие события не запускаются, когда пользователь нажимает клавишу; мы не можем перехватить клавиши курсора, чтобы переместить наш линкор. Delphi Помогите!
Перехват ввода с клавиатуры
Большинство приложений Delphi обычно обрабатывают пользовательский ввод через определенные обработчики событий, которые позволяют нам захватывать пользователя нажатия клавиш и процесс движение мыши.
Мы знаем, что фокус - это возможность получать пользовательский ввод с помощью мыши или клавиатуры. Только объект, имеющий фокус, может получить событие клавиатуры. Некоторые элементы управления, такие как TImage, TPaintBox, TPanel и TLabel, не могут получить фокус. Основной целью большинства графических элементов управления является отображение текста или графики.
Если мы хотим перехватить ввод с клавиатуры для элементов управления, которые не могут получить фокус ввода, нам придется иметь дело с Windows API, перехватчиками, обратными вызовами и Сообщения.
Крючки для Windows
Технически, функция «ловушки» - это функция обратного вызова, которую можно вставить в сообщение Windows. система, так что приложение может получить доступ к потоку сообщений, прежде чем другая обработка сообщения занимает место. Среди многих типов оконных хуков клавиатурная хук вызывается всякий раз, когда приложение вызывает GetMessage () или PeekMessage (), и есть сообщение клавиатуры WM_KEYUP или WM_KEYDOWN для процесс.
Чтобы создать хук клавиатуры, который перехватывает весь ввод с клавиатуры, направленный на данный поток, нам нужно вызвать SetWindowsHookEx API функция. Подпрограммы, которые получают события клавиатуры, представляют собой определяемые приложением функции обратного вызова, называемые функциями ловушки (KeyboardHookProc). Windows вызывает функцию перехвата для каждого сообщения нажатия клавиши (нажатие клавиши вверх и вниз), прежде чем сообщение будет помещено в очередь сообщений приложения. Функция ловушки может обрабатывать, изменять или отменять нажатия клавиш. Крючки могут быть локальными или глобальными.
возвращаемое значение SetWindowsHookEx - это дескриптор только что установленного хука. Перед завершением приложение должно вызвать UnhookWindowsHookEx функция для освобождения системных ресурсов, связанных с ловушкой.
Пример Keyboard Hook
В качестве демонстрации зацепок клавиатуры мы создадим проект с графическим управлением, который может принимать нажатия клавиш. TImage является производным от TGraphicControl, его можно использовать как поверхность для рисования в нашей гипотетической игре в битву. Поскольку TImage не может получать нажатия клавиш через стандартные события клавиатуры, мы создадим функцию ловушки, которая перехватывает весь ввод с клавиатуры, направленный на нашу поверхность рисования.
События клавиатуры обработки изображений
Начать новый Delphi Project и поместите один компонент Image в форму. Установите для свойства Image1.Align значение alClient. Вот и все для визуальной части, теперь мы должны сделать немного кодирования. Сначала нам понадобится немного глобальные переменные:
вар
Форма 1: TForm1;
Крюк: крюк; {это перехватывает ввод с клавиатуры}
cx, cy: целое число; {отслеживать позицию боевого корабля}
{объявление обратного вызова}
function KeyboardHookProc (Код: целое число; WordParam: Слово; LongParam: LongInt): LongInt; STDCALL;
реализация
...
Чтобы установить хук, мы вызываем SetWindowsHookEx в событии OnCreate формы.
процедура TForm1.FormCreate (Отправитель: TObject);
начать
{Установите хук клавиатуры, чтобы мы могли перехватить ввод с клавиатуры}
KBHook: = SetWindowsHookEx (WH_KEYBOARD,
{callback>} @KeyboardHookProc,
HINSTANCE,
GetCurrentThreadId ());
{поместите боевой корабль в середину экрана}
cx: = Image1.ClientWidth div 2;
cy: = Image1.ClientHeight div 2;
Image1.Canvas. PenPos: = точка (cx, cy);
конец;
Чтобы освободить системные ресурсы, связанные с ловушкой, мы должны вызвать функцию UnhookWindowsHookEx в событии OnDestroy:
процедура TForm1.FormDestroy (Отправитель: TObject);
начать
{отцепить перехват клавиатуры}
UnHookWindowsHookEx (KBHook);
конец;
Наиболее важной частью этого проекта является Процедура обратного вызова KeyboardHookProc используется для обработки нажатий клавиш.
function KeyboardHookProc (Код: целое число; WordParam: Слово; LongParam: LongInt): LongInt;
начать
бывает комп из
vk_Space: {стереть путь боевого корабля}
начать
с Form1.Image1.Canvas сделать
начать
Щетка. Цвет: = белый;
Щетка. Стиль: = bsSolid;
Fillrect (Form1.Image1.ClientRect);
конец;
конец;
vk_Right: cx: = cx + 1;
vk_Left: cx: = cx-1;
vk_Up: cy: = cy-1;
vk_Down: cy: = cy + 1;
конец; {кейс}
Если cx <2, то cx: = Form1.Image1.ClientWidth-2;
Если cx> Form1.Image1.ClientWidth -2, то cx: = 2;
Если cy <2, то cy: = Form1.Image1.ClientHeight -2;
Если cy> Form1.Image1.ClientHeight-2, то cy: = 2;
с Form1.Image1.Canvas сделать
начать
Ручка. Цвет: = Ясный;
Щетка. Цвет: = ClYellow;
TextOut (0,0, Формат ('% d,% d', [cx, cy]));
Прямоугольник (cx-2, cy-2, cx + 2, cy + 2);
конец;
Результат: = 0;
{Чтобы Windows не передавала нажатия клавиш в целевое окно, значение Result должно быть ненулевым.}
конец;
Вот и все. Теперь у нас есть окончательный код обработки клавиатуры.
Обратите внимание только на одно: этот код никоим образом не ограничен для использования только с TImage.
Функция KeyboardHookProc служит общим механизмом KeyPreview & KeyProcess.